Sql server 根据两列中的值筛选出重复行

Sql server 根据两列中的值筛选出重复行,sql-server,distinct,Sql Server,Distinct,我有下表: CREATE TABLE [TABLE_1] ( ID decimal(28,6) NULL, S_DATE datetime NULL, NR decimal(28,6) NULL, ); INSERT INTO TABLE_1 (ID, S_DATE, NR) VALUES (1, '2020-01-01', 1), (1, '2020-01-01', 2), (1, '2020-05-02', 3); 一个简单的查询:

我有下表:

CREATE TABLE [TABLE_1] 
(
    ID decimal(28,6) NULL,
    S_DATE datetime  NULL,
    NR decimal(28,6) NULL,
);

INSERT INTO TABLE_1 (ID, S_DATE, NR)
VALUES (1, '2020-01-01', 1),
       (1, '2020-01-01', 2),
       (1, '2020-05-02', 3);
一个简单的查询:

SELECT *  
FROM Table_1 t1
返回:

+----+----------------------+----+
| ID |        S_DATE        | NR |
+----+----------------------+----+
|  1 | 2020-01-01T00:00:00Z |  1 |
|  1 | 2020-01-01T00:00:00Z |  2 |
|  1 | 2020-05-02T00:00:00Z |  3 |
+----+----------------------+----+
但我想过滤掉共享相同
ID
su日期的重复项,如下所示:

+----+----------------------+----+
| ID |        S_DATE        | NR |
+----+----------------------+----+
|  1 | 2020-01-01T00:00:00Z |  1 |
|  1 | 2020-05-02T00:00:00Z |  3 |
+----+----------------------+----+

SQL FIDLE:

您可以使用一个公共表表达式,该表达式将行号应用于具有相同
ID
/
S_DATE
值的每个后续行,然后对该行号进行筛选

;WITH src AS 
(
  SELECT ID, S_DATE, NR, rn = ROW_NUMBER() OVER 
     (PARTITION BY ID, S_DATE ORDER BY NR)
  FROM dbo.TABLE_1
)
SELECT ID, S_DATE, NR
  FROM src
  WHERE rn = 1;
您也可以这样做,这更简单,但当您有许多列要分组时(或者如果您希望包含更复杂的逻辑,其中包括
NR
),这样做要复杂得多:

SELECT ID, S_DATE, NR = MIN(NR)
  FROM dbo.TABLE_1
  GROUP BY ID, S_DATE;