查询从postgresql中的最后一个记录期间获取数量

时间:2016-11-04 22:16:46

标签: sql postgresql

我一直试图让这个查询这么久,我就放弃了,来到这里向你求助。真的很多人,很多早晨,下午只花时间试图制定这个单一的单一查询,几乎让我失去理智。无论如何,我会直接和你在一起,我们走了:

我有一张桌子:

     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你可以想象的任何东西,买就是不能通过它。有任何想法可以实现这一目标吗?

由于

2 个答案:

答案 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()

SQL DEMO

 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 |