Найти несколько максимальных дат в одном запросе - PullRequest
0 голосов
/ 02 июля 2018

У меня есть набор данных, где я пытаюсь найти следующее: Если statusid = 113917, то я хочу найти максимальную дату и назвать ее «starttatusdate». Если statusid = 49938, тогда я найду максимальную дату и назову ее «endstatusdate».

 declare @t table(practid int, statusid int, statusdate date)

 insert into @t values (1, 113917, '2018-03-01'),
                        (1, 113917, '2018-04-01'),
                        (1, 113917, '2018-05-01'),
                        (1, 49938, '2018-06-01'),
                        (2, 113917, '2018-03-15'),
                        (2, 113917, '2018-03-18'),
                        (2, 49938, '2018-04-22')  

Я хочу такой результат:

    practid           startstatusdate     endstatusdate
      1                  2018-03-01          2018-06-01
      2                  2018-03-15          2018-04-22

Я могу создать это с помощью двух временных таблиц: одна получает максимальное значение starttatusdate, а другая - максимальное значение endstatusdate, а затем присоединяется к этим таблицам. Но я бы хотел сделать это одним запросом.

Я пытался что-то вроде этого:

    Select practid,
           (select max(statusdate)
            from Table A
            where statusid = 113917) as startstatusdate,
           (select max(statusdate)
            from Table A
            where statusid = 49938) as endstatusdate
    from Table A
    group by practid

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

То, что сказал @JNevill, верно, это простое утверждение CASE.

DECLARE @T TABLE(PRACTID INT, STATUSID INT, STATUSDATE DATE)

INSERT INTO @T VALUES (1, 113917, '2018-03-01'),
                        (1, 113917, '2018-04-01'),
                        (1, 113917, '2018-05-01'),
                        (1, 49938, '2018-06-01'),
                        (2, 113917, '2018-03-15'),
                        (2, 113917, '2018-03-18'),
                        (2, 49938, '2018-04-22')  

SELECT PRACTID,
    MIN(CASE STATUSID WHEN 113917 THEN STATUSDATE END) AS STARTSTATUSDATE,
    MAX(CASE STATUSID WHEN 49938 THEN STATUSDATE END) AS ENDSTATUSDATE
FROM @T
GROUP BY PRACTID

ПРИМЕЧАНИЕ : (на основе ваших желаемых результатов) Похоже, вы хотите использовать MIN для startstatusdate, это должно применить ваши желаемые результаты к вашей объявленной таблице @t

0 голосов
/ 02 июля 2018

Вы можете использовать case выражения, чтобы брать только значения из соответствующих статусов:

SELECT   practid,
         MAX(CASE statusid WHEN 113917 THEN statusdate END) AS startstatusdate,
         MAX(CASE statusid WHEN 49938 THEN statusdate END) AS endstatusdate
FROM     table_a
GROUP BY practid
...