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

Posted

技术标签:

【中文标题】显示重复行指示器,重复时只获取一行【英文标题】:Display duplicate row indicator and get only one row when duplicate 【发布时间】:2021-04-08 20:39:32 【问题描述】:

我在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');

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

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

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

我试过了

ROW_NUMBER() OVER (PARTITION BY ....

但到目前为止运气不佳。

【问题讨论】:

1) 请不要使用图像作为数据 - 使用格式化文本。 2)向我们展示您的完整尝试,而不仅仅是部分线路。 【参考方案1】:
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

【讨论】:

【参考方案2】:

这只是对每个 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

【讨论】:

以上是关于显示重复行指示器,重复时只获取一行的主要内容,如果未能解决你的问题,请参考以下文章

如何从SQL Server中的重复行中获取最后一行?

如何将重复的数据行排列成一行

Android Listview 行重复项

如果某些行仍未支付,则在每一行中重复收集的金额

pandas删除数据行中的重复数据行基于dataframe所有列删除重复行基于特定数据列或者列的作何删除重复行删除重复行并保留重复行中的最后一行pandas删除所有重复行(不进行数据保留)

我们如何获取数组中表的所有行? [重复]