ВЫБЕРИТЕ не дублирующиеся строки со значением приоритета - PullRequest
3 голосов
/ 17 января 2020

У меня есть таблица, которая содержит строки с измерениями. Для одного и того же идентификатора партии можно указать несколько мер. Я хочу получить правильные значения при следующих условиях:

  • Если для данной партии есть только одна строка, мера действительна
  • Если существует более одной строки того же типа, мера НЕ является действительной, и возвращаемый тип должен быть «Неверный», со значением = 0
  • Если имеется более одной строки другого типа (одна «Приобретенная» и одна «Проверенная») возвращаемая строка должна быть проверенной

Пример данных:

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

Ответы [ 2 ]

4 голосов
/ 17 января 2020

Ваш лог c немного сложен для подражания. Вы можете делать то, что вы хотите с условной агрегацией. Кажется, лог c это:

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;
1 голос
/ 17 января 2020

Использование windows функций:

;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

Демо здесь

...