T-SQL,使用Union去重,但多保留一列
T-SQL, using Union to dedupe , but retain an additional column
我正在使用 T-SQL 到 return 数据库中的记录(有多个条件,但唯一 ID 列表必须不同),简而言之,T-SQL 看起来像这样:
SELECT
t1.ID,
[query1mark] = 1
WHERE criteria1 = 1
UNION
SELECT
t1.ID,
[query2mark] = 1
WHERE criteria2 = 1
我希望能够使用 Union 在 ID 字段上进行重复数据删除(ID 字段上的数据必须是唯一的),同时保留派生列 "query1mark" 或 "query2mark" 以突出显示它另外来自哪个查询。在我的真实案例中,有 5 个查询需要相互删除重复数据,因此我需要一个有效的解决方案。
编辑:此外,第一个查询的结果需要优先于第二个查询的结果,第二个查询的结果需要优先于第三个查询的结果,据我了解,此功能使用 Union 时是固有的,因为它只会从 Union 语句下面添加记录。
Union 是最好的解决方案吗?如果不是,我可以使用什么?
谢谢
这个怎么样:
DECLARE @DataSource TABLE
(
[ID] INT
,[criteria] INT
);
INSERT INTO @DataSource ([ID], [criteria])
VALUES (1, 1)
,(1, 2)
,(2, 1)
,(3, 1)
,(3, 2)
,(4, 2);
WITH DataSource ([ID], [query_mark], [RowID]) AS
(
SELECT *
,ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [criteria] ASC)
FROM @DataSource
)
SELECT [id], [query_mark]
FROM DataSource
WHERE [RowID] = 1;
想法是为特定组创建所有重复元素的序列。重复项按 criteria
字段排序,但您可以根据需要更改逻辑 - 例如显示最大的 criteria
。该组是使用 PARTITION BY [ID]
语句定义的,这意味着,为每个 [ID]
组订购商品。然后,在select中,我们只需要每组显示一条记录[RowID] = 1
您可以使用前 1 名并列
SELECT top 1 with ties * FROM yourtable
ORDER BY ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [criteria])
我正在使用 T-SQL 到 return 数据库中的记录(有多个条件,但唯一 ID 列表必须不同),简而言之,T-SQL 看起来像这样:
SELECT
t1.ID,
[query1mark] = 1
WHERE criteria1 = 1
UNION
SELECT
t1.ID,
[query2mark] = 1
WHERE criteria2 = 1
我希望能够使用 Union 在 ID 字段上进行重复数据删除(ID 字段上的数据必须是唯一的),同时保留派生列 "query1mark" 或 "query2mark" 以突出显示它另外来自哪个查询。在我的真实案例中,有 5 个查询需要相互删除重复数据,因此我需要一个有效的解决方案。
编辑:此外,第一个查询的结果需要优先于第二个查询的结果,第二个查询的结果需要优先于第三个查询的结果,据我了解,此功能使用 Union 时是固有的,因为它只会从 Union 语句下面添加记录。
Union 是最好的解决方案吗?如果不是,我可以使用什么?
谢谢
这个怎么样:
DECLARE @DataSource TABLE
(
[ID] INT
,[criteria] INT
);
INSERT INTO @DataSource ([ID], [criteria])
VALUES (1, 1)
,(1, 2)
,(2, 1)
,(3, 1)
,(3, 2)
,(4, 2);
WITH DataSource ([ID], [query_mark], [RowID]) AS
(
SELECT *
,ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [criteria] ASC)
FROM @DataSource
)
SELECT [id], [query_mark]
FROM DataSource
WHERE [RowID] = 1;
想法是为特定组创建所有重复元素的序列。重复项按 criteria
字段排序,但您可以根据需要更改逻辑 - 例如显示最大的 criteria
。该组是使用 PARTITION BY [ID]
语句定义的,这意味着,为每个 [ID]
组订购商品。然后,在select中,我们只需要每组显示一条记录[RowID] = 1
您可以使用前 1 名并列
SELECT top 1 with ties * FROM yourtable
ORDER BY ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [criteria])