使用 T-SQL 基于一列获取不同的行
Get distinct rows based on one column with T-SQL
我有一列格式如下:
Time Value
17:27 2
17:27 3
我想根据 一个 列获取不同的行:时间。所以我的预期结果是 one 结果。 17:27 3 或 17:27 3.
不同
T-SQL 在多列而不是一列上使用 distinct。 Distinct 将 return 两行,因为 Time 和 Value 的组合是唯一的(见下文)。
select distinct [Time], * from SAPQMDATA
会return
Time Value
17:27 2
17:27 3
而不是
Time Value
17:27 2
分组依据
分组依据似乎也不起作用
select * from table group by [Time]
将导致:
Column 'Value' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
问题
如何在不考虑 select 查询中提供的其他列的情况下 select 所有唯一的 'Time' 列?
如何删除重复条目?
在这里 ROW_NUMBER 将成为您最好的朋友。使用此作为您的示例数据...
time value
-------------------- -----------
17:27 2
17:27 3
11:36 9
15:14 5
15:14 6
.. 以下是您可以 copy/paste/run.
的两个解决方案
DECLARE @youtable TABLE ([time] VARCHAR(20), [value] INT);
INSERT @youtable VALUES ('17:27',2),('17:27',3),('11:36',9),('15:14',5),('15:14',6);
-- The most elegant way solve this
SELECT TOP (1) WITH TIES t.[time], t.[value]
FROM @youtable AS t
ORDER BY ROW_NUMBER() OVER (PARTITION BY t.[time] ORDER BY (SELECT NULL));
-- A more efficient way solve this
SELECT t.[time], t.[value]
FROM
(
SELECT t.[time], t.[value], ROW_NUMBER() OVER (PARTITION BY t.[time] ORDER BY (SELECT NULL)) AS RN
FROM @youtable AS t
) AS t
WHERE t.RN = 1;
每个returns:
time value
-------------------- -----------
11:36 9
15:14 5
17:27 2
我有一列格式如下:
Time Value
17:27 2
17:27 3
我想根据 一个 列获取不同的行:时间。所以我的预期结果是 one 结果。 17:27 3 或 17:27 3.
不同
T-SQL 在多列而不是一列上使用 distinct。 Distinct 将 return 两行,因为 Time 和 Value 的组合是唯一的(见下文)。
select distinct [Time], * from SAPQMDATA
会return
Time Value
17:27 2
17:27 3
而不是
Time Value
17:27 2
分组依据
分组依据似乎也不起作用
select * from table group by [Time]
将导致:
Column 'Value' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
问题
如何在不考虑 select 查询中提供的其他列的情况下 select 所有唯一的 'Time' 列?
如何删除重复条目?
在这里 ROW_NUMBER 将成为您最好的朋友。使用此作为您的示例数据...
time value
-------------------- -----------
17:27 2
17:27 3
11:36 9
15:14 5
15:14 6
.. 以下是您可以 copy/paste/run.
的两个解决方案DECLARE @youtable TABLE ([time] VARCHAR(20), [value] INT);
INSERT @youtable VALUES ('17:27',2),('17:27',3),('11:36',9),('15:14',5),('15:14',6);
-- The most elegant way solve this
SELECT TOP (1) WITH TIES t.[time], t.[value]
FROM @youtable AS t
ORDER BY ROW_NUMBER() OVER (PARTITION BY t.[time] ORDER BY (SELECT NULL));
-- A more efficient way solve this
SELECT t.[time], t.[value]
FROM
(
SELECT t.[time], t.[value], ROW_NUMBER() OVER (PARTITION BY t.[time] ORDER BY (SELECT NULL)) AS RN
FROM @youtable AS t
) AS t
WHERE t.RN = 1;
每个returns:
time value
-------------------- -----------
11:36 9
15:14 5
17:27 2