【问题标题】:Generate a ID column based on group by as well as the row number根据分组依据和行号生成 ID 列
【发布时间】:2022-11-30 22:44:16
【问题描述】:

我正在尝试构建一个数据库,我希望按照预期输出中提到的那样对数据进行格式化。以下是DDL

CREATE TABLE TEST
(UID int, A1 VARCHAR(10), A2 VARCHAR(10), A3 VARCHAR(10), A4 VARCHAR(10));

INSERT INTO TEST VALUES
(1, 'A1' , 'B1', 'C1', NULL),
(2, 'A1' , 'B1', 'C1', 'D1'),
(3, 'A2' , 'B2', 'C2', 'D1'),
(4, 'A1' , 'B1', 'C1', 'D2'),
(5, 'A2' , 'B2', 'C2', 'D4'),
(6, 'A2' , 'B2', 'C2', 'D6'),
(7, NULL, NULL, 'C3' , NULL),
(8,  NULL, NULL, 'C3' , 'd7');

我正在寻找的是创建两个 ID 列 - 一个基于 A1、A2、A3 列组合的分组,另一个基于这三列中的 row_number

预期成绩:

UID A1 A2 A3 A4 R1ID R2ID
7 Null Null C3 null 1 1
8 Null Null C3 d7 1 2
1 A1 B1 C1 null 2 1
2 A1 B1 C1 D1 2 2
4 A1 B1 C1 D2 2 3
3 A2 B2 C2 D1 3 1
5 A2 B2 C2 D4 3 2
6 A2 B2 C2 D6 3 3

我试过了

select *,
       row_number() over (partition by A1,A2,A3 ORDER BY A4) AS R2ID 
FROM TEST;

这只是给了我预期结果 (R2ID) 的最后一列,但我怎样才能同时获得预期的列 (R1ID n R2ID)?

【问题讨论】:

标签: sql-server database group-by row-number


【解决方案1】:

您可以通过使用 DENSE_RANK() 并按“分组”列进行排序来获得您的第一个 ID,正如您所说,您的第二个 ID 使用 ROW_NUMBER() 并按这些相同的列进行分区。这给出了您的预期结果:

SELECT  t.UID,
        t.A1,
        t.A2,
        t.A3,
        t.A4,
        R1ID = DENSE_RANK() OVER (ORDER BY t.A1, t.A2, t.A3),
        R2ID = ROW_NUMBER() OVER (PARTITION BY t.A1, t.A2, t.A3 ORDER BY t.A4)
FROM    TEST AS t;

Example on db<>fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多