显示重复行指示符,重复时只获取一行

时间:2021-04-08 20:39:32

标签: sql sql-server tsql

我在 http://sqlfiddle.com/#!18/7e9e3

构建了架构
CREATE TABLE BoatOwners 
(
     BoatID INT,
     OwnerDOB DATETIME,
     Name VARCHAR(200)
);

INSERT INTO BoatOwners (BoatID, OwnerDOB,Name)
VALUES (1, '2021-04-06', 'Bob1'),
       (1, '2020-04-06', 'Bob2'),
       (1, '2019-04-06', 'Bob3'),
       (2, '2012-04-06', 'Tom'),
       (3, '2009-04-06', 'David'),
       (4, '2006-04-06', 'Dale1'),
       (4, '2009-04-06', 'Dale2'),
       (4, '2013-04-06', 'Dale3');

我想编写一个查询来产生以下结果特征:

  1. 每艘船只返回一位船主
  2. 当一艘船上有多位船主时,返回最年轻的船主。
  3. 显示一列以指示一艘船是否有多个所有者。

因此应用该查询时将产生以下数据集

enter image description here

我试过了

ROW_NUMBER() OVER (PARTITION BY ....

但到目前为止还没有多少运气。

2 个答案:

答案 0 :(得分:3)

with data as (
    select BoatID, OwnerDOB, Name,
        row_number() over (partition by BoatID order by OwnerDOB desc) as rn,
        count() over (partition by BoatID) as cnt
    from BoatOwners
)
select BoatID, OwnerDOB, Name,
    case when cnt > 1 then 'Yes' else 'No' end as MultipleOwner
from data
where rn = 1

答案 1 :(得分:1)

这只是对每个 BoatId 组的行进行编号并计算每个组中的行数,然后进行相应过滤的情况:

select BoatId, OwnerDob, Name, Iif(qty=1,'No','Yes') MultipleOwner 
from (
    select *, Row_Number() over(partition by boatid order by OwnerDOB desc)rn, Count(*) over(partition by boatid) qty
    from BoatOwners
)b where rn=1