【问题标题】:T-SQL how to add sequence number for groups, duplicate values in special column should have same orderT-SQL如何为组添加序列号,特殊列中的重复值应具有相同的顺序
【发布时间】:2013-03-06 17:45:45
【问题描述】:

我在表格中的数据:

id gname1 gname2 date1 order1 1 数据 1 1 5 红色数据 5 2 4 蓝色数据 4 3 6 蓝色数据 6 4 3 蓝色 1 数据 3 5 8 蓝色 color2 数据 8 8 2 红色数据 2 6 7 数据 7 7

我需要在我的查询中获得一个新的编号列 (order2), 应按现有的“order1”列排序, 如果“gname1 不为空”和“gname1 和 gname2 都相同”,我们应该使用相同的值(组中的第一个),所以 #5=#2=2 和 #4=#6=3。

我想要什么:

id gname1 gname2 date1 order1 order2 1 数据 1 1 1 5 红色数据 5 2 2 4 蓝色数据 4 3 3 6 蓝色数据 6 4 3 3 蓝色 1 数据 3 5 4 2 红色数据 2 6 2 7 数据 7 7 5 8 蓝色 2 数据 8 8 6

数据库:sql server 2008

谢谢。

【问题讨论】:

  • 看看ID 1 and 7。不是order2的值是1吗?
  • @JW - “gname1 is not null”是匹配的条件之一,我假设空值被解释为NULL

标签: sql-server sql-server-2008 tsql


【解决方案1】:

我认为您需要重新设计您的架构,因为这对我来说有点不愉快。

但是,如果您真的想这样做,那么以下查询将起作用:

;WITH cte([id],[gname1],[gname2],[date1],[order1])
AS
(
            SELECT 1 [id],  NULL [gname1],  NULL [gname2],  'data 1' [date1],   1 [order1]
UNION ALL   SELECT 5,       'red',          NULL,           'data 5',           2
UNION ALL   SELECT 4,       'blue',         NULL,           'data 4',           3
UNION ALL   SELECT 6,       'blue',         NULL,           'data 6',           4
UNION ALL   SELECT 3,       'blue',         'color1',       'data 3',           5
UNION ALL   SELECT 8,       'blue',         'color2',       'data 8',           8
UNION ALL   SELECT 2,       'red',          NULL,           'data 2',           6
UNION ALL   SELECT 7,       NULL,           NULL,           'data 7',           7
)

SELECT
     [id]
    ,[gname1]
    ,[gname2]
    ,[date1]
    ,DENSE_RANK() OVER(ORDER BY [order1]) [order1]
FROM
    (
        SELECT 
             x.[id]
            ,x.[gname1]
            ,x.[gname2]
            ,x.[date1]
            ,MIN(ISNULL(y.order1, x.order1)) [order1]
        FROM 
            cte x
        LEFT OUTER JOIN 
            cte y
            ON
            x.gname1 IS NOT NULL 
            AND
            x.gname1 = y.gname1
            AND
            ISNULL(x.gname2, '') = ISNULL(y.gname2, '')
        GROUP BY
            x.[id],x.[gname1],x.[gname2],x.[date1]
    ) z

【讨论】:

  • 它有效。这确实不是一个好的架构,我将先更改它。谢谢!
猜你喜欢
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 2021-01-11
  • 2021-10-21
  • 1970-01-01
  • 2019-01-12
相关资源
最近更新 更多