postgresql 组的最小日期

问题描述 投票:0回答:3

我有包含数据的表格:

create table measure_app_scalemeasurement (
  store_code text,
  certificate_id text,
  audit_ending date);
insert into measure_app_scalemeasurement values
('K010','vwv',  '10.12.2023'),
('K010','cert1','12.12.2023'),
('K054','vwv',  '14.12.2023'),
('K054','cert1','20.01.2024');

我想为每个市场

audit_ending
选择最小
store_code
日期,同时也获得相应的
cert_id

这是我尝试过的查询

select store_code, certificate_id, min(audit_ending) from measure_app_scalemeasurement
group by store_code, certificate_id

但是它提供了所有市场

store_code
,并且这个查询:

select distinct on (store_code) store_code, certificate_id, min(audit_ending) from measure_app_scalemeasurement
group by store_code, certificate_id

它给出了市场 K010 的最小日期,但没有给出市场 K054 的最小日期。对于 K054,它给出了最大日期。

我想通过其证书 ID 获取市场的第一个最短日期 像这样:

商店代码 证书_id 审核结束
K010 vwv 2023年12月10日
K054 vwv 2024年1月20日
sql postgresql group-by min distinct-on
3个回答
1
投票

你的

distinct on
几乎是正确的:演示

select distinct on(store_code) store_code, certificate_id, audit_ending
from measure_app_scalemeasurement
order by store_code, audit_ending;
商店代码 证书_id 审核结束
K010 vwv 2023-12-10
K054 vwv 2023-12-14

您只需要一个匹配的

order by
,这样对于每个
store_code
它只保留最早(最短)日期。


0
投票

使用 row_number() + 过滤器 rn=1:

select market,  certificate_id,   date
from 
(
select market,  certificate_id,   date,
       row_number() over(partition by market order by date) rn
) s 
where rn = 1

0
投票

您可以使用窗口函数

row_number()
来按每个市场的audit_ending排序记录。

如果您有联系并且想要将其全部退回,您也可以使用

rank()
代替
row_number()
(例如具有相同两个最低 audit_ending 的市场)。

select *
from (
  select *, row_number() over (partition by market order by audit_ending) as rn
  from mytable
) as s
where rn = 1;

演示在这里

© www.soinside.com 2019 - 2024. All rights reserved.