如何为每一行编写加入日期时间的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章