使用其他条件选择非唯一行,在一列上区分

时间:2018-05-24 21:19:09

标签: sql-server tsql group-by unique

好的,我知道有很多关于这个问题的变化,但我在这里。

我从这个查询开始。

SELECT lprArchived, lprReportId, lprOwner
FROM ReportIndex
WHERE lprArchived = 1

在大多数情况下,返回的每一行在lprReportId列中都会有唯一值。但是,对于lprReportId中多行具有相同值的情况,我只想要一行。

那是哪一个?我更喜欢lprOwner = 'ABCD'的行。

是否可以编写一个返回唯一行的查询,如果行不是唯一的,请给我一个lprOwner = 'ABCD'的那个?

注意:我认为对于给定的lprOwner = 'ABCD',只有一行符合lprReportId,但如果由于某种原因有多个,我仍然只想要返回一行

2 个答案:

答案 0 :(得分:1)

试试这个: 每lprReportId只需一条记录,如果有多个条目具有相同的lprReportId,则会优先考虑lprOwner ='ABCD'

的条目
SELECT t.Archived, t.ReportID, t.[Owner]
FROM (
    SELECT 
        ROW_NUMBER() OVER ( PARTITION BY lprReportId ORDER BY lprReportId, CASE WHEN lprOwner = 'ABCD' THEN 1 ELSE 10 END ) AS RowNum,
        lprArchived AS Archived,
        lprReportId AS ReportID,
        lprOwner AS [Owner]

    FROM 
        ReportIndex

    WHERE
        lprArchived = 1
) t
WHERE t.RowNum = 1

答案 1 :(得分:0)

select top 1
        lprArchived, 
        lprReportId, 
        lprOwner
    from ReportIndex
    where 
        lprArchived = 1
    order by case when lprOwner = 'ABCD' then 0 else 1 end asc

这将采取所有匹配,在顶部按“ABCD”排序,然后取第一行。如果您有任何其他选择行的条件,则可以将其添加到order by子句的末尾(例如,最新的)。