【发布时间】:2014-09-22 07:13:29
【问题描述】:
我试图将这两行并排排成一行,所以我做了一个内部连接
;WITH data AS
(
SELECT 1 id, 'a' AS c1 UNION ALL
SELECT 1 id, 'b' AS c1
)
SELECT *
FROM data d
INNER JOIN data d2
ON d.id = d2.id
AND d.c1 <> d2.c1
这会返回 两 行,a-b 和 b-a,它们基本相同,但顺序相反。我怎样才能删除这个准重复?
-- expected results would be just one row (1, a, b)
SELECT 1 d1_id, 'a' AS d1_c1, 'b' AS d2_c1
请注意,可能有两个以上的记录共享相同的 ID。例如,
SELECT 1 id, 'a' AS c1 UNION ALL
SELECT 1 id, 'b' AS c1 union all
SELECT 1 id, 'c' AS c1
sql server 2012
编辑:刚刚想通了。 Row_number 会给我我需要的东西。
;WITH data AS
(
SELECT *
,ROW_NUMBER() OVER(PARTITION BY id ORDER BY c1) rn
FROM (
SELECT 1 id, 'a' AS c1 UNION ALL
SELECT 1 id, 'b' AS c1 union ALL
SELECT 1 id, 'c' AS c1
) z
)
SELECT *
FROM data d
INNER JOIN data d2
ON d.id = d2.id
AND d.c1 <> d2.c1
WHERE d.rn = 1
【问题讨论】:
-
您正在寻找一个支点。使用连接会导致人为的解决方案,并且对于超过 2 行根本不起作用。
-
我已经使用 row_number 解决了它(我认为)。见编辑。
-
你已经编辑了你的问题@Gabe,但我写的查询和你一样,但我的问题 (A,b) 和 (A,c) 来了,但是 (B,C) 组合呢
-
@mohan111 嗯,你是对的。 (B,C) 组合不包括在内。我不知道如何包含(B,C)的组合。幸运的是,当前的解决方案使用“A”作为锚点来引入所有其他可能的值“B”和“C”。这可能足以满足我的需求。
标签: sql sql-server