如何在 SQL 服务器的集群中连接同名值?
How to concat values under the same name in a cluster in SQL Server?
我有一个很大的 table 格式如下:
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
我的目的是得到一个像这样的 table:
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
我目前正在为每个位置使用这样的代码,但它给了我最后显示的 table:
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
有人知道在这种情况下如何保持最小值 row_number 吗?
你差不多完成了。这是完整的工作示例:
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;
正如我所说,你几乎完成了。我刚刚添加了三个额外的列来标记要在其中找到最小值的组。
我有一个很大的 table 格式如下:
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
我的目的是得到一个像这样的 table:
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
我目前正在为每个位置使用这样的代码,但它给了我最后显示的 table:
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
有人知道在这种情况下如何保持最小值 row_number 吗?
你差不多完成了。这是完整的工作示例:
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;
正如我所说,你几乎完成了。我刚刚添加了三个额外的列来标记要在其中找到最小值的组。