Как объединить значения под одним именем в кластере в SQL Server? - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть большая таблица в следующем формате:

rox_number()      date_time            position_1   position_2  position_3
--------------------------------------------------------------------------
   1           2018-01-05 06:30:00         0           0           0
   2           2018-01-05 06:35:00         0           0           1
   3           2018-01-05 06:40:00         1           0           1
   4           2018-01-05 06:45:00         1           0           0
   5           2018-01-05 06:50:00         1           1           0
   6           2018-01-05 06:55:00         0           1           1
   7           2018-01-05 07:00:00         0           1           1

И моя цель - получить такую ​​таблицу:

rox_number()       date_time           position_1   position_2  position_3
--------------------------------------------------------------------------
   1           2018-01-05 06:30:00         0           0           0
   2           2018-01-05 06:35:00         0           0         p3_2
   3           2018-01-05 06:40:00        p1_3         0         p3_2
   4           2018-01-05 06:45:00        p1_3         0           0
   5           2018-01-05 06:50:00        p1_3       p2_5          0
   6           2018-01-05 06:55:00         0         p2_5        p3_6
   7           2018-01-05 07:00:00         0         p2_5        p3_6

В настоящее время я использую такой кодпо одному на каждую из позиций, но это дает мне последнюю показанную таблицу:

when position_1 = 1 then concat('p1_', row_number() over (order by date_time)) end) as position_1



  rox_number()     date_time           position_1   position_2  position_3
  --------------------------------------------------------------------------
     1         2018-01-05 06:30:00         0           0           0
     2         2018-01-05 06:35:00         0           0         p3_2
     3         2018-01-05 06:40:00        p1_3         0         p3_3
     4         2018-01-05 06:45:00        p1_4         0           0
     5         2018-01-05 06:50:00        p1_5       p2_5          0
     6         2018-01-05 06:55:00         0         p2_6        p3_6
     7         2018-01-05 07:00:00         0         p2_7        p3_7

Кто-нибудь знает, как сохранить минимальный номер строки в этом случае?

1 Ответ

0 голосов
/ 17 декабря 2018

Вы почти сделали это.Вот полный рабочий пример:

DECLARE @DataSource TABLE
(
    [date_time] DATETIME2(0)
   ,[position_1] BIT
   ,[position_2] BIT
   ,[position_3] BIT
);

INSERT INTO @DataSource ([date_time], [position_1], [position_2], [position_3])
VALUES ('2018-01-05 06:30:00', 0, 0, 0)
      ,('2018-01-05 06:35:00', 0, 0, 1)
      ,('2018-01-05 06:40:00', 1, 0, 1)
      ,('2018-01-05 06:45:00', 1, 0, 0)
      ,('2018-01-05 06:50:00', 1, 1, 0)
      ,('2018-01-05 06:55:00', 0, 1, 1)
      ,('2018-01-05 07:00:00', 0, 1, 1);

WITH DataSource ([row_id], [date_time], [position_1], [position_2], [position_3], x, y, z) AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY [date_time])
          ,[date_time]
          ,IIF([position_1] = 1, CONCAT('p1_', ROW_NUMBER() OVER (ORDER BY [date_time])), NULL) 
          ,IIF([position_2] = 1, CONCAT('p1_', ROW_NUMBER() OVER (ORDER BY [date_time])), NULL) 
          ,IIF([position_3] = 1, CONCAT('p1_', ROW_NUMBER() OVER (ORDER BY [date_time])), NULL) 
          --
          ,COUNT(IIF([position_1] = 0, 1, NULL)) OVER (ORDER BY [date_time])
          ,COUNT(IIF([position_2] = 0, 1, NULL)) OVER (ORDER BY [date_time])
          ,COUNT(IIF([position_3] = 0, 1, NULL)) OVER (ORDER BY [date_time])
    FROM @DataSource
)
SELECT [row_id]
      ,[date_time]
      ,IIF([position_1] IS NULL, '0', MIN([position_1]) OVER (PARTITION BY x))
      ,IIF([position_2] IS NULL, '0', MIN([position_2]) OVER (PARTITION BY y))
      ,IIF([position_3] IS NULL, '0', MIN([position_3]) OVER (PARTITION BY z))
FROM DataSource;

enter image description here

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

...