SQL查询以选择具有改变粒度的记录

Posted

技术标签:

【中文标题】SQL查询以选择具有改变粒度的记录【英文标题】:SQL query to select records with altering granularity 【发布时间】:2021-02-21 13:20:41 【问题描述】:

我有一个新闻文章表,articles,每篇文章都有一个date 属性。大多数日子记录了多篇文章,有些日子根本没有。

我希望能够选择不同粒度的文章 - 例如,每天一篇、每月一篇等。我发现了与 daily 甚至 monthly 相关的问题,但是由于用户可以选择粒度(例如,每 3 天一篇文章),因此有多个查询来处理每个可能的粒度级别是不可行的

这是否可以使用 SQL 实现,或者是否需要选择每篇文章,然后使用不同的语言进行过滤?


也许粒度是错误的词 - 这是表格的一个示例:

id date headline
1 2020-01-01 This one weird trick...
2 2020-01-01 These two weird tricks...
3 2020-01-01 These fifty weird tricks...
4 2020-01-02 This one crazy trick...
5 2020-01-02 This one odd trick...
6 2020-01-03 These tricks...
7 2020-01-04 These tricks...
8 2020-01-05 These tricks...

粒度为 1 天,查询应返回第 1、4、6、7、8 行。粒度为 3 天时,将选择 1 和 7,因为 7 是第 3 天后的第一条记录首先。

【问题讨论】:

请您提供一些示例数据和您想要达到的结果,因为对我来说,您想要达到的目标非常不清楚。 @NickW 我重读了它,它有点模糊 - 在一个例子中编辑过 (1) 所以您只想在每个日期返回 1 条记录?如果是这样,它是否应该始终是该日期的 id 最低的记录,还是可以是任何记录? (2) 您希望能够将整数 x 传递到查询中,以便您可以每 x 天选择一条记录? (3) 查询总是从第一个(最低 id)记录开始,还是希望能够传入动态开始日期? 【参考方案1】:

您可以使用递归 CTE,它返回您想要包含在结果中的所有日期并将其连接到表中:

WITH cte(date) AS (
  SELECT MIN(date) FROM articles
  UNION ALL
  SELECT date(date, '+3 days')
  FROM cte
  WHERE date(date, '+3 days') <= (SELECT MAX(date) FROM articles)
)
SELECT MIN(a.id) id, a.date, a.headline 
FROM articles a INNER JOIN cte c
ON c.date = a.date
GROUP BY a.date

请参阅demo。

【讨论】:

以上是关于SQL查询以选择具有改变粒度的记录的主要内容,如果未能解决你的问题,请参考以下文章

sql查询以选择两列中具有相同id但不同值的记录

SQL 查询以查找从中选择记录的同一个表

SQL查询以选择具有最小值的不同行

SQL 查询过滤记录

如何编写sql查询以选择一列中具有最大值的行

如何提高 SQL Server 查询的性能以选择具有值的行不在子查询中的一次计数