根据 2 列中的值过滤掉重复行
Filter out duplicate row based on values in 2 columns
我有以下 table:
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
Returns:
+----+----------------------+----+
| 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
和 S_DATE
的重复项,如下所示:
+----+----------------------+----+
| ID | S_DATE | NR |
+----+----------------------+----+
| 1 | 2020-01-01T00:00:00Z | 1 |
| 1 | 2020-05-02T00:00:00Z | 3 |
+----+----------------------+----+
SQL FIDDLE: LINK
您可以使用常见的 table 表达式,该表达式将行号应用于具有相同 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;
我有以下 table:
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
Returns:
+----+----------------------+----+
| 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
和 S_DATE
的重复项,如下所示:
+----+----------------------+----+
| ID | S_DATE | NR |
+----+----------------------+----+
| 1 | 2020-01-01T00:00:00Z | 1 |
| 1 | 2020-05-02T00:00:00Z | 3 |
+----+----------------------+----+
SQL FIDDLE: LINK
您可以使用常见的 table 表达式,该表达式将行号应用于具有相同 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;