Разделение SQL, как выбрать запись в секционированной группе, которая соответствует определенным критериям?

#sql #sql-server #tsql #window-functions

#sql #sql-server #tsql #окно-функции

Вопрос:

У меня есть запрос. Этот запрос:

 select Q1.* from (
    select
        a.CreatedDate as KynectCreatedDate,
        a.FirstName,
        b.CaseStatusCode,
        a.Id as ContactId,
        a.Email as EmailAddress,
        a.MobilePhone,
        row_number() over (partition by a.Email order by b.CaseStatusCode desc) as row
    from
        ent.Contact_Salesforce a
    left join
        ent.SOMETABLE_Contact_Shared c on a.Email = c.Email
    left join
        ent.SOMETABLE_Case_Shared b on c.IndividualId = b.IndividualId and c.CaseNumber = b.CaseNumber
    where a.Email = 'aaa@aaa.com') Q1
where Q1.row = 1
  

Вот что я хочу. Группа записей, которые возвращаются, как определено в предложении partition by — скажем, есть 3, которые возвращаются (номер строки 1, 2, 3). Если CaseStatusCode имеет значение «AC» для любого из них, ВЫБЕРИТЕ ЭТУ ЗАПИСЬ ИЗ ГРУППЫ. В противном случае НЕ ИМЕЕТ ЗНАЧЕНИЯ, КАКУЮ ЗАПИСЬ Я ВЫБИРАЮ. Прямо сейчас запрос просто выбирает первую запись в группе ( where Q1.row = 1 ). Мне трудно понять, как это сделать. Есть идеи?

Ответ №1:

Поместите эту информацию в order by :

     row_number() over (partition by a.Email order by (case when b.CaseStatusCode 'AC' then 1 else 2 end) as row