SQL如何对包含相同数据的两个不同列进行分组

时间:2019-05-11 02:42:33

标签: sql sql-server tsql

如何将以下数据分组在一起。
请注意,相同的数据可以在不同的列中,也可以在同一列中。

| 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(),用于识别不同列之间的“重复项”
空值将被忽略。

3 个答案:

答案 0 :(得分:0)

我想,您需要COALESCE才能从MobileHome值中返回非空值,并根据结果可以将文本分组并创建{{ 1}}。

因此您可以应用GroupIdCOALESCE(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,您可以根据自己的业务需求进行更改。

Demo on db <> fiddle

答案 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

DB Fiddle

答案 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;