0

我在表中的数据:

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

谢谢。

4

1 回答 1

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
于 2013-03-06T09:45:45.713 回答