PostgreSQL:如何为这种情况编写查询

时间:2017-09-18 22:39:24

标签: sql postgresql postgresql-9.4

我有下表。

+_______+________+__________+________+
|Playid |billid|  amount    | Date   |
+_______+________+__________+________+
|123    | 345    | 144.9    | 2015-09|
|123    | 456    | 200      | 2015-10|
+_______+________+__________+________+

我需要编写一个查询,以便仅显示最近交易日期(日期)的账单金额,如下所示。

+_______+________+__________+________+
|Playid |billid|  amount    | Date   |
+_______+________+__________+________+
|123    | 456    | 200      | 2015-10|
+_______+________+__________+________+

请帮我怎么做。

2 个答案:

答案 0 :(得分:1)

如果您只想显示MAX(Date)和最近的日期,可以使用

playid

然而,您要尝试执行的操作的问题是您要显示所有列。这就是排名功能发挥作用的地方。在这种情况下,您可以像这样使用row_number function

SELECT PlayId, billid, amount, date
FROM 
(
  SELECT
    PlayId, billid, amount, date,
    row_number() over(partition by playid order by date dec) as rn
  FROM tablename
) t
where rn = 1

row_number() over(partition by playid order by date dec)会为每组playid提供排名,第一组(最低的)将是最近日期的排名。然后你只需要过滤等于1的行号。

答案 1 :(得分:1)

Postgres提供distinct on。这样写起来更简单,并且通常具有最佳性能:

select distinct on (playid) t.*
from t
order by playid, order by date desc;