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查询以选择具有改变粒度的记录的主要内容,如果未能解决你的问题,请参考以下文章