对于所有行,选择满足标准的第一个条目

时间:2016-11-09 14:18:45

标签: sql oracle greatest-n-per-group

假设我有一张日记表。日记中的每个条目都有user_identry_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

我怎样才能做到这一点?

2 个答案:

答案 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}}