如何为每一行编写加入日期时间的 SQL 查询

Posted

技术标签:

【中文标题】如何为每一行编写加入日期时间的 SQL 查询【英文标题】:How to write an SQL query joining on datetime for each row 【发布时间】:2019-06-19 08:52:47 【问题描述】:

我有以下数据数据,包括新闻(每篇文章都有发布日期和时间)和视图(在特定时间戳记录每个视图):

news

id, published_timestamp
1, 2018-11-16 13:30:24
2, 2018-12-03 13:59:56
...
views

view_id, post_id, viewed_timestamp
a, 1, 2018-11-16 13:30:24
b, 1, 2018-11-16 13:30:25
c, 1, 2018-11-16 13:30:26
d, 2, 2018-12-03 13:59:56
e, 2, 2018-12-03 13:59:57
f, 2, 2018-12-05 13:59:57
...

获取每篇新闻文章的终生浏览量很简单:

SELECT 
post_id, count(view_id) 
FROM views 
GROUP BY post_id

如何编写一个 SQL 查询(我正在使用 AWS Redshift)来加入相对于已发布日期时间的视图?例如,我想只获得每篇文章在发布后 1 天内的浏览量。

【问题讨论】:

您使用的是哪个 dbms? 分享样本输出 好点@jarlh 我没有注意到sql 唯一的标签,我猜我在我的观看标签中点击了 sql 而不是 mysql ANSI/ISO SQL 标准会说 EXTRACT() 解析 DATETIME datetype 因为问题用 sql 标记,但像 @jarlh 建议你应该标记你使用的 RDMS 感谢提问,我从 AWS Redshift 查询。 【参考方案1】:

你需要这样的东西

select n.id, n.published_timestamp,
       count(v.post_id) as views__within_1_day_of_post
from news as n
left join views as v on n.id=v.post_id 
                    and v.viewed_timestamp between n.published_timestamp and n.published_timestamp + interval '1 day'
group by 1, 2

【讨论】:

【参考方案2】:
SELECT V.post_id,  count(V.view_id)
FROM views as V INNER JOIN news as N on N.id = V.post_id
WHERE Date(N.published_timestamp) = Date(V.viewed_timestamp)
GROUP BY V.post_id
    这里Inner Join获取post的所有浏览记录。 Date() 函数仅从 DATETIME 列获取日期值 在我检查的 WHERE 子句中,如果发布日期和查看日期相同以过滤掉其他日期 那么GROUP BY会统计浏览记录,只针对发布日

【讨论】:

如果您能解释一下您的解决方案以便其他人也能理解,那就太好了

以上是关于如何为每一行编写加入日期时间的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何为过去 3 个月的每个日期运行查询

Oracle SQL 排名查询

SQL 每 7 天插入日期,持续 10 年

SQL 查询 - 在小于或等于日期时加入

如何为 h:dataTable/ui:repeat 的每一行/项目设置转换器属性?

从其他表更新表 SQL