Различать по одному столбцу с дополнительными критериями для выбора неуникальных строк - PullRequest
0 голосов
/ 25 мая 2018

Хорошо, я знаю, что было задано много вариантов по этому вопросу, но здесь я иду.

Я начинаю с этого запроса.

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

В большинстве случаев,каждая возвращаемая строка будет иметь уникальное значение в столбце lprReportId.Однако для случаев, когда несколько строк имеют одно и то же значение в lprReportId, мне нужна только одна строка.

Так какая?Я бы предпочел строку, где lprOwner = 'ABCD'.

Можно ли написать запрос, который будет возвращать уникальные строки, и, в случае, если строки не были уникальными, дать мне тот, который имеет lprOwner = 'ABCD'?

Примечание: я полагаю, что только одна строка будет соответствовать lprOwner = 'ABCD' для данного lprReportId, но если по какой-то причине их было больше одного, я все равно хотел бы вернуть только одну строку.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018
select top 1
        lprArchived, 
        lprReportId, 
        lprOwner
    from ReportIndex
    where 
        lprArchived = 1
    order by case when lprOwner = 'ABCD' then 0 else 1 end asc

Это займет все совпадения, закажите их с «ABCD» вверху, а затем возьмите первый ряд.Если у вас есть какие-либо другие критерии для выбора строк, вы можете добавить их в конец предложения по предложению (например, самое последнее).

0 голосов
/ 25 мая 2018

Попробуйте: это займет одну запись на 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
...