首页 > 解决方案 > 使用 T-SQL 根据一列获取不同的行

问题描述

我有以下格式的列:

Time  Value
17:27   2
17:27   3

我想根据列获得不同的行:时间。所以我的预期结果将是一个结果。17:27 3 或 17:27 3。

清楚的

T-SQL 在多列而不是一列上使用 distinct。Distinct 将返回两行,因为 Time 和 Value 的组合是唯一的(见下文)。

select distinct [Time], * from SAPQMDATA

会回来

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.

问题

如何在不考虑选择查询中提供的其他列的情况下选择所有唯一的“时间”列?
如何删除重复条目?

标签: tsqlazure-sql-server

解决方案


这就是ROW_NUMBER将成为您最好的朋友的地方。使用它作为您的样本数据...

time                 value
-------------------- -----------
17:27                2
17:27                3
11:36                9
15:14                5
15:14                6

.. 以下是您可以复制/粘贴/运行的两种解决方案。

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;

每个返回:

time                 value
-------------------- -----------
11:36                9
15:14                5
17:27                2

推荐阅读