[英]SELECT non duplicated rows with priority value
我有一個包含帶有測量值的行的表。 對於同一個批次 ID,可以指定多個度量。 我想在以下條件下獲得正確的值:
樣本數據:
create table measures (
batch int,
type varchar(24),
value int
);
insert into measures select 01,'Verified',10;
insert into measures select 02,'Acquired',34;
insert into measures select 03,'Verified',22;
insert into measures select 03,'Verified',24;
insert into measures select 04,'Verified',32;
insert into measures select 04,'Acquired',34;
insert into measures select 05,'Acquired',42;
insert into measures select 05,'Acquired',44;
示例輸出:
01 Verified 10
02 Acquired 34
03 Invalid 0
04 Verified 32
05 Invalid 0
你的邏輯有點難以理解。 您可以使用條件聚合做您想做的事情。 它認為的邏輯是:
select batch,
(case when count(*) = 1 then max(type)
when min(type) = max(type) then 'Invalid'
else coalesce(max(case when type = 'Verified' then 'Verified' end), 'Invalid')
end) as type,
(case when count(*) = 1 then max(value)
when min(type) = max(type) then 0
else coalesce(max(case when type = 'Verified' then value end), 0)
end) as value
from measures m
group by batch;
使用窗口函數:
;WITH CountTypesPerBatch AS
(
SELECT batch, type, value,
COUNT(CASE WHEN type = 'Verified' THEN 1 END)
OVER (PARTITION BY batch) AS verified,
COUNT(CASE WHEN type = 'Acquired' THEN 1 END)
OVER (PARTITION BY batch) AS acquired,
ROW_NUMBER() OVER (PARTITION BY batch
ORDER BY IIF(type='Verified',1, 2)) seq
FROM measures
)
SELECT DISTINCT batch,
CASE
WHEN verified > 1 OR acquired > 1 THEN 'invalid'
WHEN verified = 1 THEN 'verified'
ELSE 'acquired'
END,
CASE
WHEN verified > 1 OR acquired > 1 THEN 0
ELSE value
END
FROM CountTypesPerBatch
WHERE seq = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.