学习 SQL - 迷失在 SQL 游戏中

Learning SQL - Lost at SQL game

提问人:IDK 提问时间:11/7/2023 最后编辑:Thorsten KettnerIDK 更新时间:11/7/2023 访问量:116

问:

当我学习SQL时,我发现了一些擅长教你的游戏。我被困在“迷失在SQL”游戏中的“搜索”挑战中。

任何人都可以解决这个案子吗?我在上面坚持了好几天,然后敲打着我的头

非常感谢更高级的人向我展示代码,以便我可以分析和学习 iT:)

https://lost-at-sql.therobinlord.com/challenge-page/search

返回包含“path”、“diff_total_clicks”和“diff_unique_keywords”列的表。

对于每个路径,表格应显示最近 2 天和前 2 天之间的点击次数和唯一身份关键字的差异。

按点击次数的变化降序对数据进行排序。

我认为我的 JOIN 做错了什么

这是我走得最远的地方

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


sql sqlite

评论

1赞 Thorsten Kettner 11/7/2023
下次,请将任务描述放入您的请求中,这样我们就不必在其他站点上查找它。始终将所有必要的信息放入您的请求中。拥有一些示例数据会很有帮助。您甚至可以用示例数据制作小提琴(例如:dbfiddle.uk),我们可以使用这些数据来处理您的请求。
0赞 Bohemian 11/7/2023
表的架构是什么?请在您的问题中显示。

答:

0赞 Ozan BAYRAM 11/7/2023 #1
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;

评论

0赞 IDK 11/7/2023
你能说得更具体一点吗?因为它似乎不起作用。从我的观点来看,如果我们这里有聚合函数,我认为应该有一个 GROUP by 子句,但我检查了它,它没有;t 工作
0赞 Ozan BAYRAM 11/7/2023
对不起,伙计,这就是我能从你的问题中理解的全部内容。也许你可以提供你的表架构或一些测试数据来理解。
0赞 Thorsten Kettner 11/7/2023 #2

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

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

您应该选择每个路径的最大日期和前一天的数据,然后聚合数据。然后,您将在前两天执行相同的操作,然后比较结果。

因此,对于每条路径,我们感兴趣的是需要路径最大日期的四天。我们可以在聚合查询中获取它,如上所示,也可以使用窗口函数即时获取它: .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 减去三天。因此,我至少应该为每个路径获得一个 maximum-pt 行。一定是SQLite奇怪的日期/时间处理,其中不存在正确的数据类型或类似的东西。不幸的是,我在该站点上没有看到表定义。我们也没有看到选定的数据和预期的数据来得出结论。也许SQLite专业人士可以在这里提供帮助。

评论

0赞 IDK 11/8/2023
谢谢。很高兴知道它比看起来更难,而且我从一周开始学习 SQL,似乎它并不容易解决:D此外,我没有在主帖子中包含整个表格,因为我认为自己进入游戏并解决它要容易得多,因为它会立即为您提供反馈,如果它是对还是错,而不是在这里发布可能有效也可能无效的多种解决方案。也希望一些SQLite大师能看到它,并能帮助解决:)