PostgreSQL:如何为此场景编写查询

PostgreSQL:如何为此场景编写查询,sql,postgresql,postgresql-9.4,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    | 345    | 144.9    | 2015-09|
|123    | 456    | 200      | 2015-10|
+_______+________+__________+________+
我需要编写一个查询,只显示具有最新交易日期(日期)的票据金额,如下所示

+_______+________+__________+________+
|Playid |billid|  amount    | Date   |
+_______+________+__________+________+
|123    | 456    | 200      | 2015-10|
+_______+________+__________+________+
请帮助我如何操作。

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

但是,您尝试执行的问题是,您希望显示所有列。这就是排名功能发挥作用的地方。在这种情况下,您可以像这样使用:

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()(按playid顺序按日期dec划分)
将为每组
playid
提供一个排名号,第一个(最低的)将是最近日期的编号。然后,只需对等于1的行号进行筛选。

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

但是,您尝试执行的问题是,您希望显示所有列。这就是排名功能发挥作用的地方。在这种情况下,您可以像这样使用:

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()(按playid顺序按日期dec划分)
将为每组
playid
提供一个排名号,第一个(最低的)将是最近日期的编号。然后,您只需要对等于1的行号进行筛选。

Postgres提供了
上的distinct on
。这更易于编写,并且通常具有最佳性能:

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

Postgres在上提供不同的
。这更易于编写,并且通常具有最佳性能:

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

@FerdinandGaspar我尝试在select and having子句中使用max(Date)和case语句,但效果不理想。@KushalLNU您必须接受其中一个有效答案,而不是将“谢谢”作为答案,只需单击解决问题答案的投票箭头下方的标记即可issue@FerdinandGaspar我尝试使用max(Date)如果在select and having子句中有一个case语句,但它没有按预期工作。@KushalLNU您必须接受一个工作答案,而不是将“谢谢”作为答案,只需单击解决问题的答案投票箭头下方的标记即可