sqlite 学习SQL -迷失在SQL游戏

iaqfqrcu  于 11个月前  发布在  SQLite
关注(0)|答案(2)|浏览(92)

当我学习SQL的时候,我发现了一些很好的游戏来教你。我被困在“迷失在SQL”游戏的“搜索”转换中。
任何人都能解决这个案子?我被困了好几天,在这个问题上绞尽脑汁。
真的很感激更高级的人向我展示代码,这样我就可以在iT上分析和学习:)
https://lost-at-sql.therobinlord.com/challenge-page/search
返回一个包含“path”、“diff_total_clicks”和“diff_unique_keywords”列的表。
对于每个路径,该表应显示最近2天与前2天之间的点击量和唯一关键字的差异。
按点击次数的变化对数据进行降序排序。
我想我做错了我的加入
这是我走得最远的地方

SELECT
  S.path,
  coalesce(sum(clicks) - XDtotal_clicks, sum(clicks)) as diff_total_clicks,
  coalesce(Count(distinct query) - XDunique_query,Count(distinct query))  as diff_unique_keywords

from
  search_data as S
  LEFT JOIN (
    SELECT
      path,
      sum(clicks) as XDtotal_clicks,
      Count(distinct query) as XDunique_query
    from
      search_data
    where
      pt < '2022-04-31'
      and pt > '2022-04-29'
    GROUP BY
      path
  ) as XD on XD.path = S.path
where
  pt > '2022-04-31'
GROUP BY
  S.path

字符串

kx5bkwkv

kx5bkwkv1#

SELECT
    a.path,
    (b.total_clicks - a.total_clicks) AS diff_total_clicks,
    (b.unique_keywords - a.unique_keywords) AS diff_unique_keywords
FROM
    (SELECT path, total_clicks, unique_keywords FROM search_data WHERE date = 'most_recent_date') a
JOIN
    (SELECT path, total_clicks, unique_keywords FROM search_data WHERE date = 'most_recent_date_minus_two_days') b
ON a.path = b.path;

字符串

jgovgodb

jgovgodb2#

每个路径都有一个最近的日期:

select path, max(pt)
from search_data
group by path;

字符串
您应该选择每个路径的最大日期和前一天的数据并将其聚合。然后您应该对前两天进行同样的操作,然后比较结果。
因此,对于每个路径,我们需要路径的最大日期为4天。我们可以通过如上所示的聚合查询或窗口函数MAX(pt) OVER (PARTITION BY path)来获取它。

with
  data as
  (
    select sd.*, max(pt) over (partition by path) as max_pt
    from search_data sd
  )
select
  path,
  sum(case when pt >= date(max_pt, '-1 day') then clicks else -clicks end)
    as diff_total_clicks,
  count(distinct case when pt >= date(max_pt, '-1 day') then query end) -
  count(distinct case when pt <  date(max_pt, '-1 day') then query end)
    as diff_unique_keywords
from data
where pt >= date(max_pt, '-3 days')
group by path
order by diff_total_clicks desc;


由于不了解表,我使用了与您相同的列。我希望查询足够直观。在聚合函数调用中使用CASE表达式被称为“条件聚合”。它可以帮助两个人同时处理不同的聚合(前两天与前两天)。
我的查询没有通过测试。我试过了,得到错误消息:
结果缺少1个预期行。
结果中有1个不正确的行。
我不明白为什么会缺少一行。我按路径分组,并选择每个路径的pt大于或等于其最大pt减去三天的所有行。因此,每个路径至少应该有一个最大pt行。一定是SQLite的奇怪日期/在没有正确的数据类型或类似的东西的情况下,时间处理。不幸的是,我在那个站点上没有看到表定义。我们看到了所选的数据和预期的数据,以便得出结论。也许一个SQLite pro可以在这里有所帮助。

相关问题