【问题标题】:SQL Adding # PrefixSQL 添加#前缀
【发布时间】:2020-06-15 03:50:03
【问题描述】:

我有一个看起来像这样的选择查询

类型原因影响
增强数据传输化妆品
增强数据传输用户参与度
增强前端化妆品
增强前端用户参与度
问题数据传输化妆品
问题前端用户参与度
发布数据传输化妆品
发布前端用户参与度

我需要选择查询变成这样

类型原因影响
1.Enhancement 1.Data Transfer 11.Cosmetic
1.Enhancement 2.Data Transfer 12.User Engagement
1.增强 3.前端 13.化妆品
1.增强 4.前端 14.用户参与
2.问题 1.数据传输 21.化妆品
2.问题 2.前端 22.用户参与
3.问题 1.数据传输 31.化妆品
3.问题 2.前端 32.用户参与度

基本上第一列具有相同的前缀 # 每个唯一值,第二列的增量为 # 并重置每个第一列的值已更改。第三列只是第一列与第二列的组合。基于字母升序的值增加。

我认为这与行号和分区有关

【问题讨论】:

  • 行的排序顺序是什么?有没有你没有显示的钥匙?
  • 默认排序。增强问题和问题的前缀 # 可以是任何 #。我只需要它像格式。我考虑过使用dense_rank选择第一行,然后按类型与row_number分区进行连接
  • 准确地说,也许在前 2 列中使用前缀 # 也是适用于 2008 sql 的查询:/

标签: sql sorting row-number


【解决方案1】:

你在寻找这样的东西吗?

select (dense_rank() over (order by type) || '.' || type) as ntype,
       (row_number() over (partition by type order by cause, impact)) || '.' || cause as ncause,
       (dense_rank() over (order by type) || row_number() over (partition by type order by cause, impact)) || '.' ||  impact) as nimpact
from t
order by ntype, ncause, nimpact;

【讨论】:

  • 语法 ||适用于较新的 sql?我用的是 2008 r2。请参阅下面我的答案,但想知道是否有更简单的查询。
  • @DavidChen。 . . || 是用于字符串连接的 SQL 标准运算符。您的问题没有正在使用的数据库的标签,因此使用标准语法。
【解决方案2】:

这是我的答案,还有更简单的吗?

Select t1.Type,t1.Cause,Cast(t2.rnType as VARCHAR(9))+Cast(t3.rnCause as VARCHAR(9))+'.'+t1.Impact,t1.Tickets FROM
(SELECT [Type] as Type,(Case WHEN [Cause]='' THEN 'null' ELSE [Cause] END) as Cause,(Case WHEN [Impact]='' THEN 'null' ELSE [Impact] END) as Impact,count([Id]) as Tickets FROM {SupportTicket}
GROUP BY [Type],(Case WHEN [Cause]='' THEN 'null' ELSE [Cause] END),(Case WHEN [Impact]='' THEN 'null' ELSE [Impact] END)) t1
左连接
(SELECT [Type] as Type,dense_rank() over (ORDER By [Type]) as rnType FROM {SupportTicket}
分组依据 [类型]) t2
ON t1.Type=t2.Type
左连接
(SELECT [Type] as Type,[Cause] as Cause,dense_rank() over (PARTITION BY [Type] ORDER By [Cause]) as rnCause FROM {SupportTicket}
GROUP BY [类型],[原因]) t3
ON t1.Type=t3.Type 和 t1.Cause=t3.Cause

【讨论】:

    【解决方案3】:

    也许像

    SELECT 
      concat(typeInc, '.', Type) as Type,
      concat(causeInc, '.', Cause) as Cause,
      concat(typeInc, causeInc, '.', Impact) as Impact
    FROM (
      SELECT 
        TypeInc = DENSE_RANK() OVER (ORDER BY Type),
        CauseInc = ROW_NUMBER() OVER (PARTITION BY Type ORDER BY Cause),
        *
      FROM tbl
      ) withInc
     ORDER by Type, Cause, Impact;
    

    http://sqlfiddle.com/#!18/bbcd95/27/0的演示


    SQL 2008 兼容版本

    SELECT 
      typeInc + '.' + Type as Type,
      causeInc + '.' + Cause as Cause,
      typeInc + causeInc + '.' + Impact as Impact
    FROM (
      SELECT 
        TypeInc = CAST(DENSE_RANK() OVER (ORDER BY Type) AS varchar(3)),
        CauseInc = CAST(ROW_NUMBER() OVER (PARTITION BY Type ORDER BY Cause) AS varchar(3)),
        *
      FROM tbl
      ) withInc
     ORDER by Type, Cause, Impact;
    

    http://sqlfiddle.com/#!18/bbcd95/29/0的演示

    【讨论】:

    • 不幸的是,我的公司正在使用 sql 2008:/
    • 只需使用+ 而不是concat添加字符串(并将排名数字转换为`varchars)。 更新答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    相关资源
    最近更新 更多