Порядок изменения созданных конкатенированных переменных столбца - PullRequest
0 голосов
/ 30 мая 2019

Вот мой вопрос - есть ли способ отредактировать мой код так, чтобы время RequestedDateTime1 из запроса 1 оставалось на одном уровне с соответствующим EventDisplay1 из запроса 1?

Вот как я пришел с этим вопросом.

У меня есть следующий код:

SELECT [Financial Number], [Depart Date & Time], 
             (Cast(Year([Arrival Date & Time]) as nvarchar) +'-'+ Cast (Month([Arrival Date & Time]) as nvarchar)) as Yr_Mon,
             [Event 1 Display],
             [Event 1 Personnel - Completed],
             [Requested 1 Date & Time],
             [Completed 1 Date & Time],
             ROW_NUMBER() OVER (PARTITION BY [Financial Number] ORDER BY [Event 1 Display]) AS RB,
             ROW_NUMBER() OVER (PARTITION BY [Financial Number] ORDER BY [Requested 1 Date & Time]) AS RN,
             ROW_NUMBER() OVER (PARTITION by [Financial Number] ORDER BY [Completed 1 Date & Time]) AS RM,
             ROW_NUMBER() OVER (PARTITION by [Financial Number] ORDER BY [Event 1 Personnel - Completed]) AS RO,
             ROW_NUMBER() OVER (PARTITION by [Financial Number] ORDER BY [Arrival Date & Time]) as AD,
             ROW_NUMBER() OVER (PARTITION by [Financial Number] ORDER BY [Depart Date & Time]) as DT
FROM [ED_Dispo_Events_Using_Event_1 Triage Level 3] AS ED

, который дает результаты, которые выглядят следующим образом (это сокращенно из-за нехватки места):

[Financial Number] [Depart Date & Time] .. EventDisplay1 RequestedDateTime1
      1              2018-01-01 10:19:11     EP Exam     2018-01-01 11:19 
      1              2018-01-01 10:19:11     Discharge   2018-01-01 12:20
      2              2018-01-01 13:49:11     EP Exam     2018-01-01 12:20

Затем я добавляю запрос к запросу данных 1:

Select [Financial Number], 
   MIN(CASE DT WHEN 1 THEN [Depart Date & Time] END) AS [Depart Date & 
   Time1],
   MIN(CASE RB WHEN 1 THEN [Event 1 Display] END) AS EventDisplay1,
   MIN(CASE RB WHEN 2 THEN [Event 1 Display] END) AS EventDisplay2,
   MIN(CASE RB WHEN 3 THEN [Event 1 Display] END) AS EventDisplay3,
   MIN(CASE RO WHEN 1 THEN [Event 1 Personnel - Completed] END) AS 
   EventPersonnelCompleted1,
   MIN(CASE RO WHEN 2 THEN [Event 1 Personnel - Completed] END) AS 
   EventPersonnelCompleted2,
   MIN(CASE RO WHEN 3 THEN [Event 1 Personnel - Completed] END) AS 
   EventPersonnelCompleted3,
   MIN(CASE RN WHEN 1 THEN [Requested 1 Date & Time] END) AS RequestedDateTime1,
   MIN(CASE RN WHEN 2 THEN [Requested 1 Date & Time] END) AS RequestedDateTime2,
   MIN(CASE RN WHEN 3 THEN [Requested 1 Date & Time] END) AS RequestedDateTime3,
   MIN(CASE RM WHEN 1 THEN [Completed 1 Date & Time] END) AS CompletedDateTime1,
   MIN(CASE RM WHEN 2 THEN [Completed 1 Date & Time] END) AS CompletedDateTime2,
   MIN(CASE RM WHEN 3 THEN [Completed 1 Date & Time] END) AS CompletedDateTime3,

  FROM
 (

SELECT [Financial Number], [Depart Date & Time], 
             (Cast(Year([Arrival Date & Time]) as nvarchar) +'-'+ Cast (Month([Arrival Date & Time]) as nvarchar)) as Yr_Mon,
             [Event 1 Display],
             [Event 1 Personnel - Completed],
             [Requested 1 Date & Time],
             [Completed 1 Date & Time],
             ROW_NUMBER() OVER (PARTITION BY [Financial Number] ORDER BY [Event 1 Display]) AS RB,
             ROW_NUMBER() OVER (PARTITION BY [Financial Number] ORDER BY [Requested 1 Date & Time]) AS RN,
             ROW_NUMBER() OVER (PARTITION by [Financial Number] ORDER BY [Completed 1 Date & Time]) AS RM,
             ROW_NUMBER() OVER (PARTITION by [Financial Number] ORDER BY [Event 1 Personnel - Completed]) AS RO,
             ROW_NUMBER() OVER (PARTITION by [Financial Number] ORDER BY [Arrival Date & Time]) as AD,
             ROW_NUMBER() OVER (PARTITION by [Financial Number] ORDER BY [Depart Date & Time]) as DT
  FROM [ED_Dispo_Events_Using_Event_1 Triage Level 3] AS ED
   )sub group by [Financial Number] 

Этот запрос дает результаты, объединяющие каждую строку, поэтому каждая строка представляет собой один уникальный финансовый номер; однако при этом нарушается выравнивание переменной RequestedDateTime1 с переменной EventDisplay1. Например, используя приведенные выше примеры данных, RequestedDateTime1 от 2018-01-01 12:20, который был выровнен с DISCHARGE, теперь выровнен с EP EXAM. Я полагаю, что это потому, что код упорядочивает вновь созданные переменные EventDisplay1, EventDisplay2, EventDisplay3 в алфавитном порядке.

Пример результатов, которые являются неверными, поскольку Discharge RequestedDateTime1 соответствует EP RequestedDateTime1:

 [Financial Number]   [Depart Date & Time]  EventDisplay1    EventDisplay2 RequestedDateTime1 RequestedDateTime2
        1             2018-01-01 10:19:11    Discharge         EP Exam 2018-01-01 11:19  2018-01-01 12:20

Короче говоря, есть ли способ отредактировать мой код так, чтобы время RequestedDateTime1 из запроса 1 оставалось на одном уровне с соответствующим EventDisplay1 из запроса 1?

Желаемые результаты:

   [Financial Number]   [Depart Date & Time]  EventDisplay1    EventDisplay2 RequestedDateTime1 RequestedDateTime2
        1             2018-01-01 10:19:11     EP Exam        Discharge     2018-01-01 11:19  2018-01-01 12:20

Ответы [ 2 ]

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

Проблема в том, что вы не учитываете NULL и используете MIN, а не max.Приведите значения в строку, если вы хотите иметь допустимое значение для нуля:

Замените каждую строку, похожую на эту

MIN(CASE RB WHEN 1 THEN [Event 1 Display] END) AS EventDisplay1,

, на что-то похожее на

COALESCE(CAST(MAX(CASE WHERE RB = 1 THEN [Event 1 Display] ELSE NULL END) AS VARCHAR(20)),
         '    -- NO VALUE --  ') AS EventDisplay1,
0 голосов
/ 30 мая 2019

Вы путаетесь с нумерацией строк.То, что вы хотите сделать, это иметь один столбец порядка - один оператор ROW_NUMBER, который даст номер в строке.Затем вы хотите получить все значения, когда эта строка = 1, все значения, когда эта строка = 2 и т. Д. Таким образом, ваши данные будут иметь смысл.Все значения из rowNumber1 будут отображаться как EventDisplay1, RequestedDateTime1 и т. Д.

Обновленный запрос:

Select [Financial Number], 
   MIN(CASE DT WHEN 1 THEN [Depart Date & Time] END) AS [Depart Date & 
   Time1],
   MIN(CASE RN WHEN 1 THEN [Event 1 Display] END) AS EventDisplay1,
   MIN(CASE RN WHEN 2 THEN [Event 1 Display] END) AS EventDisplay2,
   MIN(CASE RN WHEN 3 THEN [Event 1 Display] END) AS EventDisplay3,
   MIN(CASE RN WHEN 1 THEN [Event 1 Personnel - Completed] END) AS 
   EventPersonnelCompleted1,
   MIN(CASE RN WHEN 2 THEN [Event 1 Personnel - Completed] END) AS 
   EventPersonnelCompleted2,
   MIN(CASE RN WHEN 3 THEN [Event 1 Personnel - Completed] END) AS 
   EventPersonnelCompleted3,
   MIN(CASE RN WHEN 1 THEN [Requested 1 Date & Time] END) AS RequestedDateTime1,
   MIN(CASE RN WHEN 2 THEN [Requested 1 Date & Time] END) AS RequestedDateTime2,
   MIN(CASE RN WHEN 3 THEN [Requested 1 Date & Time] END) AS RequestedDateTime3,
   MIN(CASE RN WHEN 1 THEN [Completed 1 Date & Time] END) AS CompletedDateTime1,
   MIN(CASE RN WHEN 2 THEN [Completed 1 Date & Time] END) AS CompletedDateTime2,
   MIN(CASE RN WHEN 3 THEN [Completed 1 Date & Time] END) AS CompletedDateTime3,

  FROM
 (

SELECT [Financial Number], [Depart Date & Time], 
             (Cast(Year([Arrival Date & Time]) as nvarchar) +'-'+ Cast (Month([Arrival Date & Time]) as nvarchar)) as Yr_Mon,
             [Event 1 Display],
             [Event 1 Personnel - Completed],
             [Requested 1 Date & Time],
             [Completed 1 Date & Time],
             ROW_NUMBER() OVER (PARTITION BY [Financial Number] ORDER BY [Event 1 Display]) AS RN --choose whichever column you want to determine ordering here...
  FROM [ED_Dispo_Events_Using_Event_1 Triage Level 3] AS ED
   )sub group by [Financial Number] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...