如何将以下数据分组在一起。
请注意,相同的数据可以在不同的列中,也可以在同一列中。
| Id | Mobile | Home | | 1 | NULL | 626... | | 2 | 626... | NULL | | 3 | 405... | NULL | | 4 | NULL | 405... | | 5 | 626... | 405... | | 6 | 405... | 626... |
使它产生此结果
| GroupId | Id | | 1 | 1 | | 1 | 2 | | 1 | 5 | | 1 | 6 | | 2 | 3 | | 2 | 4 | | 2 | 5 | | 2 | 6 |
GroupId可以是随机生成的ID,例如NEWID(),用于识别不同列之间的“重复项”
空值将被忽略。
答案 0 :(得分:0)
我想,您需要COALESCE
才能从Mobile
,Home
值中返回非空值,并根据结果可以将文本分组并创建{{ 1}}。
因此您可以应用GroupId
和COALESCE(Mobile, Home)
。
请找到带有示例数据的演示:
DENSE_RANK() OVER (ORDER BY
在这里,我根据DECLARE @TestTable TABLE (Id INT, Mobile INT, Home INT);
INSERT INTO @TestTable (Id, Mobile, Home) VALUES
(1, NULL, 626456),
(2, 626456, NULL),
(3, 405123, NULL),
(4, NULL, 405123);
SELECT DENSE_RANK() OVER(ORDER BY COALESCE(Mobile, Home)) AS GroupId,
Id
FROM @TestTable
ORDER BY Id
结果使用了ORDER BY
,您可以根据自己的业务需求进行更改。
答案 1 :(得分:0)
道歉,因为我很难解释自己要完成的工作。如果有人遇到这个问题,请看看这是否是潜在的解决方案
;WITH CTE AS ( SELECT * FROM ( VALUES(1, NULL, 626456), (2, 626456, NULL), (3, 405123, NULL), (4, NULL, 405123), (5, 626456, 405123), (6, 405123, 626456)) AS tbl (id, mobile, home) ), PivotCte AS ( SELECT DISTINCT pvt.value FROM CTE CROSS APPLY (VALUES('mobile', mobile), ('home', home)) AS pvt (phone, value) ) SELECT DENSE_RANK() OVER (ORDER BY p.value) as gid, c.id FROM CTE c INNER JOIN PivotCte p ON c.mobile = p.value OR c.home = p.value
答案 2 :(得分:0)
执行基表的两个UNION ALL
中的projections。在这些投影中,分别排除了gremlin> g.V().
......1> groupCount('a').
......2> by(constant('c')).
......3> out().
......4> groupCount('b').
......5> by(label).
......6> cap('a','b').as('x').
......7> select('a').select('c').as('c').
......8> select('x').select('b').unfold().
......9> group().
.....10> by(keys).
.....11> by(select(values).math('_/c'))
==>[software:0.6666666666666666,person:0.3333333333333333]
和NULL
列中包含MOBILE
的行。然后将HOME
函数应用于结果集。
DENSE_RANK
输出:
WITH
t AS (
SELECT *
FROM (
VALUES(1, NULL, 626456),
(2, 626456, NULL),
(3, 405123, NULL),
(4, NULL, 405123),
(5, 626456, 405123),
(6, 405123, 626456)
) AS t (id, mobile, home)
),
u AS (
SELECT id, mobile AS dr FROM t WHERE mobile IS NOT NULL
UNION ALL
SELECT id, home FROM t WHERE home IS NOT NULL
)
SELECT
DENSE_RANK() OVER(ORDER BY dr DESC) AS GroupId, Id
FROM u
ORDER BY GroupId, Id;