假设我有一张日记表。日记中的每个条目都有user_id
和entry_date
。
对于user_id
的范围,我想在指定日期之后选择第一个条目。
所以
user_id | entry_date
--------------------
1 | 2016-11-09 20:00:00
2 | 2016-11-09 20:00:00
1 | 2016-11-09 21:00:00
1 | 2016-11-09 22:00:00
5 | 2016-11-10 20:00:00
我想我可以写一些类似
的内容SELECT user_id,entry_date FROM entries
WHERE entries.user_id BETWEEN 10 AND 20
AND TAKE_FIRST(entries.entry_date >= to_timestamp('2016-11-09 20:30:00', 'yyyy-mm-dd hh24:mi:ss'))
(其中TAKE_FIRST()
是我不知道的占位符。)
,结果将是
user_id | entry_date
--------------------
1 | 2016-11-09 21:00:00
5 | 2016-11-10 20:00:00
我怎样才能做到这一点?
答案 0 :(得分:2)
SELECT user_id,MIN(entry_date) FROM entries
WHERE entries.user_id BETWEEN 10 AND 20
AND entry_date >= to_timestamp('2016-11-09 20:30:00', 'yyyy-mm-dd hh24:mi:ss'))
GROUP BY user_id
对于范围内的每个user_id,找到的最小日期大于您选择的日期。如果您需要entries
表中的其他数据,它将无法正常工作,否则应该是最简单的解决方案。
答案 1 :(得分:1)
使用SELECT user_id,entry_date
FROM (
SELECT user_id,entry_date,
ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY entry_date) as rnk
FROM entries
WHERE entries.user_id BETWEEN 10 AND 20
AND entries.entry_date >= to_timestamp('2016-11-09 20:30:00', 'yyyy-mm-dd hh24:mi:ss')
)
WHERE rnk = 1
:
{{1}}