Sql 选择具有优先级值的非重复行

Sql 选择具有优先级值的非重复行,sql,sql-server,select,duplicates,Sql,Sql Server,Select,Duplicates,我有一个表,其中包含带有测量值的行。对于同一批id,可以指定多个度量值。我希望在以下条件下获得正确的值: 如果给定批次只有一行,则度量值有效 如果同一类型有多行,则度量值无效,返回的类型应为“无效”,值为0 如果存在多个不同类型的行(一个“已获取”和一个“已验证”),则返回的行必须是“已验证”的行 样本数据: create table measures ( batch int, type varchar(24), value int ); insert into meas

我有一个表,其中包含带有测量值的行。对于同一批id,可以指定多个度量值。我希望在以下条件下获得正确的值:

  • 如果给定批次只有一行,则度量值有效
  • 如果同一类型有多行,则度量值无效,返回的类型应为“无效”,值为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

你的逻辑有点难以理解。通过条件聚合,您可以做您想做的事情。它认为逻辑是:

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;

使用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

您的第一个条件似乎收缩了另外两个条件。这是编写INSERT语句的一种非常奇怪的方式。VALUES子句有什么问题?您使用的是哪种产品?“SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加。数据库引擎是SQL SERVER,我添加了标记。