我一直试图让这个查询这么久,我就放弃了,来到这里向你求助。真的很多人,很多早晨,下午只花时间试图制定这个单一的单一查询,几乎让我失去理智。无论如何,我会直接和你在一起,我们走了:
我有一张桌子:
date | quantity | id
------------+----------+----
2016-06-10 | 438 | 27
2016-06-17 | 449 | 28
2016-06-24 | 458 | 29
2016-07-01 | 466 | 30
2016-07-08 | 468 | 31
2016-07-15 | 468 | 32
2016-07-22 | 473 | 33
2016-07-29 | 473 | 34
2016-08-05 | 475 | 35
2016-08-12 | 479 | 36
2016-08-19 | 488 | 37
2016-08-26 | 498 | 38
2016-09-02 | 519 | 39
我需要从每个月内的最后一天记录数量。我的意思是,从上表中我需要以下卷:
date | quantity | id
------------+----------+----
2016-06-24 | 458 | 29
2016-07-29 | 473 | 34
2016-08-26 | 498 | 38
我真正需要的决赛桌就是:
month | quantity
------------+----------
06 | 458
07 | 473
06 | 498
我尝试GROUP,HAVING,MAX,JOINS,UNIONS你可以想象的任何东西,买就是不能通过它。有任何想法可以实现这一目标吗?
由于
答案 0 :(得分:1)
Postgres有一个很棒的功能叫distinct on
:
select distinct on (date_trunc('month', date)) t.*
from t
order by date_trunc('month', date), date desc;
distinct on
为括号中的每个键值返回一行 - 在这种情况下,每月一个。哪排?数据中遇到的第一行。因此,这将返回每个月的最新日期。
答案 1 :(得分:0)
尝试使用ROW_NUMBER()
SELECT date_trunc('month', date),
quantity
FROM (
SELECT date, quantity, id,
ROW_NUMBER() OVER (PARTITION BY date_trunc('month', date)
ORDER BY date DESC) as rn
FROM Table1
) T
WHERE T.rn = 1;
<强>输出强>
| date_trunc | quantity |
|-----------------------------|----------|
| June, 01 2016 00:00:00 | 458 |
| July, 01 2016 00:00:00 | 473 |
| August, 01 2016 00:00:00 | 498 |
| September, 01 2016 00:00:00 | 519 |