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])