我有包含数据的表格:
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日 |
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
它只保留最早(最短)日期。
使用 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
您可以使用窗口函数
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;