PostgreSQL。查找记录中的最大日期范围

4

我有这些记录:

id | user_id |    date   
 1 |    1    | 2015-01-01
 2 |    1    | 2015-01-05
 3 |    2    | 2014-01-01
 4 |    2    | 2014-01-30
 5 |    3    | 2014-01-25
 6 |    3    | 2014-02-28

我希望能够为每个用户选择日期范围,并按照日期范围长度排序。

因此,在结果中,我希望得到以下内容:

 user_id |  min_date   |  max_date
    2    |  2014-01-01 | 2014-01-30
    3    |  2014-01-25 | 2014-02-28
    1    |  2015-01-01 | 2015-01-05

这个问题能否使用 SQL 查询解决?

http://sqlfiddle.com/#!15/f958b

2个回答

2
我一定是漏掉了什么显而易见的东西,这不只是一个简单的分组吗?
   SELECT user_id, 
          min(date), 
          max(date) 
     FROM test_table
 GROUP BY user_id 
 ORDER BY max(date) - min(date) DESC, 
          user_id;

感谢您的答复。请在此处检查查询结果:http://sqlfiddle.com/#!15/f958b/2 。由于30天的日期范围,user_id=2 应该在第一行,第二行应该是 user_id=3。看起来你的查询不像这样工作。 - Tom
我此刻手头上没有Postgres服务器,但如果有帮助的话,您可以添加一个desc。我已经编辑了答案。 - Philip Couling
@couling:请检查sqlfiddle链接:您确实在那里有一个Postgres服务器。 - user330315
@a_horse_with_no_name 哦,我明白了。那不仅仅是一个 pastebin 的替代品;-) 好吧。是的,添加 desc 就可以了。 - Philip Couling
1
如果任何一列可以为NULL,则在相应的“ORDER BY”项中添加“NULLS LAST”。 - Erwin Brandstetter

1
SELECT * FROM
(
SELECT user_id, MIN(date) AS min_date, 
MAX(date) AS max_date FROM test_table 
GROUP BY user_id
) t
ORDER BY max_date- min_date DESC

http://sqlfiddle.com/#!15/eb51d 谢谢。但我需要按日期范围排序。这个日期范围可以是较大的一个,但是这个日期范围的结束日期不是表中最新的日期。 - Tom
新的答案可行,谢谢!请在这里写下来(不要只放链接),我会接受它。 - Tom
我对这段代码进行了更多的测试,它没有按照需要的方式工作:( 请检查这些数据示例。user_id = 3应该在第二行,但它在第三行http://sqlfiddle.com/#!15/f958b/1 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接