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 が null ではなく」、「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 青 color2 データ 8 8 6

DB: SQL サーバー 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 に答える