Выберите строки с тем же идентификатором, но с другим значением в другом столбце - SQL Server - PullRequest
0 голосов
/ 22 мая 2019

У меня есть таблица, которая показывает цепочку хранения доказательств во время их анализа.Доказательства могут быть просто проанализированы в одном месте, но также могут быть переданы в различные лаборатории для анализа.Я пытаюсь написать запрос, который возвращает номер дела, если он анализируется в разных лабораториях.

Вот пример данных: CaseNumber 1 начинается в химической лаборатории, затем передается в лабораторию ДНК, затемпереведен обратно в химическую лабораторию.Случай 2 только что связан с Chem lab (не нужно видеть этот случай в результатах запроса).

ID   CaseNumber     Lab        ActionDate   Action
-------------------------------------------------------------------
1     1             Chem       1/1/2019     case created
2     1             Chem       1/2/2019     container created
3     1             DNA        2/1/2019     container routed to DNA
4     1             DNA        2/3/2019     evidence analyzed
5     1             Chem       2/3/2019     edit route
6     2             Chem       2/4/2019     create case
7     2             Chem       2/5/2019     analyze evidence

Вот что у меня так далеко.Это возвращает casenumber и уникальную лабораторную работу, но я хотел бы как-то включить ActionDate, чтобы показать фактическую дату, когда она была перенаправлена ​​в новое местоположение.

SELECT DISTINCT
    casenumber, lab 
FROM 
    summary 
WHERE 
    casenumber IN (SELECT a.casenumber 
                   FROM summary a
                   JOIN summary b on b.casenumber = a.casenumber AND b.lab <> a.lab)
    AND actiondate BETWEEN '2019-01-02' AND '2019-01-04'
ORDER BY
    casenumber

Я ожидаю, что результаты запроса будут выглядеть следующим образом.Я хотел бы видеть первую запись для каждой Лаборатории (поскольку это дата, когда она была фактически перенаправлена ​​в новое место)

ID   CaseNumber     Lab        ActionDate   Action
-------------------------------------------------------------------
1     1              Chem       1/1/2019    case created
3     1              DNA        2/1/2019    container routed to DNA
5     1              Chem       2/3/2019    container routed to Chem

1 Ответ

0 голосов
/ 22 мая 2019

Есть много способов сделать это, вот один из них. Обратите внимание, что это будет работать только на SQL Server 2012+.

create table #Something
(
    ID int
    , CaseNumber int
    , Lab varchar(10)
    , ActionDate date
    , Action varchar(50)
)

insert #Something values
(1, 1, 'Chem', '1/1/2019', 'case created')
, (2, 1, 'Chem', '1/2/2019', 'container created')
, (3, 1, 'DNA', '2/1/2019', 'container routed to DNA')
, (4, 1, 'DNA', '2/3/2019', 'evidence analyzed')
, (5, 1, 'Chem', '2/3/2019', 'edit route')
, (6, 2, 'Chem', '2/4/2019', 'create case')
, (7, 2, 'Chem', '2/5/2019', 'analyze evidence')
;

with SortedResults as
(
    select s.ID
        , s.CaseNumber
        , s.Lab
        , s.ActionDate
        , Action = case when LAG(Lab, 1) over(partition by CaseNumber order by ActionDate) is null then Action 
            when LAG(Lab, 1) over(partition by CaseNumber order by ActionDate) = Lab then NULL
            else 'container routed to ' + Lab end
    from #Something s
)

select *
from SortedResults
where Action > ''
order by CaseNumber, ActionDate

drop table #Something
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...