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您必须接受一个工作答案,而不是将“谢谢”作为答案,只需单击解决问题的答案投票箭头下方的标记即可