【问题标题】:SQL - add inside seq row numbersSQL - 在 seq 行号内添加
【发布时间】:2017-08-01 12:00:23
【问题描述】:

我有联合查询,我试图在每个行类型中添加一个单独的序列号查询返回:

我想添加如下所示的 seq 行号:

我如何在 sql 或 Hanna DB 中有这种行号?

【问题讨论】:

  • 请将您的信息添加为文本/代码而不是图像
  • 显示您当前的查询。行是如何排序的?
  • 在 B (2) 组中,您可能指的是最后的 Ab (3)...?
  • 什么是“汉娜 DB”?

标签: sql sql-server union row-number


【解决方案1】:
SELECT 
  CONCAT(
    MainType, 
    ' (', 
    ROW_NUMBER() OVER(PARTITION BY MainType ORDER BY MainType), 
    ')'
  ) as MainType,
  CONCAT(
    LineType, 
    ' (', 
    ROW_NUMBER() OVER(PARTITION BY MainType, LineType ORDER BY MainType, LineType), 
    ')'
  ) as LineType
FROM 
  table

【讨论】:

    【解决方案2】:

    我不了解 Hanna Db,但如果您使用的是 SQL Server,您可以在下面尝试,看看这是否是您想要的

    Create Table #Table 
    (
        MainType varchar(4),
        LineType varchar(6)
    )
    
    Insert Into #Table
    Values 
    ('A', 'Aa'),
    ('A', 'Ab'), 
    ('A', 'Aa'), 
    ('A', 'Ac'),
    ('A', 'Ab'),  
    ('B', 'Aa'), 
    ('B', 'Ab'), 
    ('B', 'Ab'), 
    ('B', 'Ac'),
    ('B', 'Ab'),
    ('C', 'Aa'),  
    ('C', 'Ac'),  
    ('C', 'Aa')
    
    
    Select *, 
    DENSE_RANK() OVER (Order By MainType) as MainTypeRank,
    ROW_NUMBER() OVER (Partition By MainType, LineType Order By LineType) as LineTypeRank
     From #Table
     Order by MainType
    

    【讨论】:

      【解决方案3】:

      试试这个代码来得到你的确切结果

      Create Table #TempTable 
      (
          MainType varchar(4),
          LineType varchar(6)
      )
      
      Insert Into #TempTable
      Values 
      ('A', 'Aa'),
      ('A', 'Ab'), 
      ('A', 'Aa'), 
      ('A', 'Ac'),
      ('A', 'Ab'),  
      ('B', 'Aa'), 
      ('B', 'Ab'), 
      ('B', 'Ab'), 
      ('B', 'Ac'),
      ('B', 'Ab'),    
      ('C', 'Aa'),  
      ('C', 'Ac'),  
      ('C', 'Aa')
      

      以上是样本数据。获取结果的脚本

      SELECT CASE 
               WHEN Lag(maintyperank) 
                      OVER( 
                        ORDER BY maintyperank) = maintyperank THEN '' 
               ELSE maintyperank 
             END AS MainType, 
             linetyperank 
      FROM   (SELECT *, 
                     maintype + '(' 
                     + Cast(Dense_rank()OVER(ORDER BY maintype) AS VARCHAR(5)) 
                     + ')' AS MainTypeRank, 
                     linetype + '(' 
                     + Cast(Row_number() OVER (partition BY maintype, linetype ORDER 
                     BY 
                            linetype)AS 
                     VARCHAR(5)) 
                     + ')' AS LineTypeRank 
              FROM   #TempTable)Dt 
      

      结果

             MainType            linetyperank
              -------------------------
              A(1)            Aa(1)
                              Aa(2)
                              Ab(1)
                              Ab(2)
                              Ac(1)
              B(2)            Aa(1)
                              Ab(1)
                              Ab(2)
                              Ab(3)
                              Ac(1)
              C(3)            Aa(1)
                              Aa(2)
                              Ac(1)
      

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 1970-01-01
        • 2016-07-23
        • 2021-12-23
        • 2020-12-16
        • 1970-01-01
        • 1970-01-01
        • 2020-10-01
        • 1970-01-01
        相关资源
        最近更新 更多