代码之家  ›  专栏  ›  技术社区  ›  Fachry Dzaky

正确使用ROW_NUMBER

  •  0
  • Fachry Dzaky  · 技术社区  · 5 月前

    This is my fiddle

    我有一张这样的桌子

    create table CTE1 (
        [CC Receiver] VARCHAR(10),
        Name VARCHAR(255),
        [Division] varchar(10),
        [Old Block] varchar(10),
        [Date] Date,
        Round VARCHAR(10),
        Platform VARCHAR(10),
        block_type VARCHAR(255),
        tph_type VARCHAR(255)
    );
    
    insert into CTE (
        [CC Receiver],
        Name,
        [Division],
        [Old Block],
        [Date],
        Round,
        Platform,
        block_type,
        tph_type
    )
    values
    ('BNAB21A020', 'ESTATE TEPIAN LANGSAT', 'A', 'M28', '2024-01-09', '45', '013', 'Bukit', 'Collection Road'),
    ('BNAB21A020', 'ESTATE TEPIAN LANGSAT', 'A', 'M28', '2024-01-09', '45', '017', 'Bukit', 'Collection Road'),
    ('BNAB21A020', 'ESTATE TEPIAN LANGSAT', 'A', 'M28', '2024-01-09', '45', '010', 'Bukit', 'Collection Road'),
    ('BNAB21A020', 'ESTATE TEPIAN LANGSAT', 'A', 'M28', '2024-01-09', '45', '024', 'Bukit', 'Collection Road'),
    ('BNAB21A020', 'ESTATE TEPIAN LANGSAT', 'A', 'M28', '2024-01-09', '46', '013', 'Bukit', 'Collection Road'),
    ('BNAB21A020', 'ESTATE TEPIAN LANGSAT', 'A', 'M28', '2024-01-09', '46', '016', 'Bukit', 'Collection Road');
    
    SELECT *
    FROM CTE;
    
    CC接收机 姓名 分部 老街区 日期 圆形 站台 block_type tph型
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 45 013 武吉 收藏路
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 45 017 武吉 收藏路
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 45 010 武吉 收藏路
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 45 024 武吉 收藏路
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 46 013 武吉 收藏路
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 46 016 武吉 收藏路

    目标是根据相同的[CC接收器]、年份(日期)、月份(日期),名称、部门、旧块和按轮次排序给出row_number。

    根据要求,这是我的查询

    SELECT *, 
        ROW_NUMBER() OVER (
            PARTITION BY YEAR(Date), MONTH(Date), [CC Receiver], Name, Division, [Old Block] 
            ORDER BY Round
        ) AS rotasi
    FROM CTE;
    

    结果如下:

    CC接收机 姓名 分部 老街区 日期 圆形 站台 block_type tph型 旋转
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 45 013 武吉 收藏路 1.
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 45 017 武吉 收藏路 2.
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 45 010 武吉 收藏路 3.
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 45 024 武吉 收藏路 4.
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 46 013 武吉 收藏路 5.
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 46 016 武吉 收藏路 6.

    这不符合我的要求,因为代码根据包括平台在内的行号进行排序,而我想要的是排除平台。

    预期结果:

    CC接收机 姓名 分部 老街区 日期 圆形 站台 block_type tph型 旋转
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 45 013 武吉 收藏路 1.
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 45 017 武吉 收藏路 1.
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 45 010 武吉 收藏路 1.
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 45 024 武吉 收藏路 1.
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 46 013 武吉 收藏路 2.
    BNAB21A020 泰国兰萨特庄园 A. M28 2024-01-09 46 016 武吉 收藏路 2.
    1 回复  |  直到 5 月前
        1
  •  3
  •   Tim Biegeleisen    5 月前

    您想使用 DENSE_RANK() 这里,不是 ROW_NUMBER() :

    SELECT t.*,
        DENSE_RANK() OVER (
            PARTITION BY YEAR(Date), MONTH(Date), [CC Receiver], Name, Division, [Old Block]
            ORDER BY Round
        ) AS rotasi
    FROM yourTable t;
    

    请注意,来自平台列的感知顺序可能是随机的。鉴于记录在没有平台值的情况下是相同的,SQL数据库可以按任何顺序选择行号。