0

以下の表の条件のフラグ設定を達成しようとしています

p_id      mon_year      e_id     flag  
----      ---------     -----    -----
 1          2011/11       20       0
 1          2011/11       21       1
 1          2012/01       22       1
 1          2012/02       23       0
 1          2012/02       24       0
 1          2012/02       25       1
 2          2011/11       28       0
 2          2011/11       29       1
 2          2012/01       30       1

p_id、e_id、および mon_year でグループ化すると、その月の最後の値にフラグが設定されます。

どうすればこれを達成できるか混乱しています

row_number と partition を使用して値を分離することで、これを達成しようとしました。達成するためにまだ探していることによって

row_number query を使用して出力すると、次のようになります。

グループ化

p_id      mon_year      e_id     row
----      ---------     -----    -----
 1          2011/11       20       1
 1          2011/11       21       2
 1          2012/01       22       1
 1          2012/02       23       1
 1          2012/02       24       2
 1          2012/02       25       3
 2          2011/11       28       1
 2          2011/11       29       2
 2          2012/01       30       1

この値の最大値は、フラグ列を設定します。しかし、私はそれを達成する方法を本当に悩ませています。どんな助けでも役に立ちます。

ありがとう !!

4

3 に答える 3

0

e_id で max ステートメントを使用して、その月の最後の値を取得できます。コードは次のとおりです。

    IF OBJECT_ID('tempdb..#tmptest') IS NOT NULL
        DROP TABLE #tmptest

    SELECT
        *
    INTO
        #tmptest
    FROM
    (
        SELECT  '1' p_id,          '2011/11' mon_year,       '20' e_id,      '0' flag UNION ALL
        SELECT  '1',          '2011/11',       '21',       '1' UNION ALL
        SELECT  '1',          '2012/01',       '22',       '1' UNION ALL
        SELECT  '1',          '2012/02',       '23',       '0' UNION ALL
        SELECT  '1',          '2012/02',       '24',       '0' UNION ALL
        SELECT  '1',          '2012/02',       '25',       '1' UNION ALL
        SELECT  '2',          '2011/11',       '28',       '0' UNION ALL
        SELECT  '2',          '2011/11',       '29',       '1' UNION ALL
        SELECT  '2', '2012/01',       '30',       '1' 
    ) as tmp

    SELECT
        tmptest.*
    FROM
        (
            SELECT 
                MAX(e_id) e_id
                ,p_id
                ,mon_year
            FROM 
                #tmptest
            GROUP BY
                p_id,mon_year
        ) tblLastValueEID
    INNER JOIN
        #tmptest tmptest
    ON
        tmptest.p_id = tblLastValueEID.p_id
    AND
        tmptest.mon_year = tblLastValueEID.mon_year
    AND
        tmptest.e_id = tblLastValueEID.e_id
于 2012-10-21T15:58:21.620 に答える
0

降順で並べてみてください。そうすれば、最大の ROW_NUMBER を探す必要はありませんが、ROW_NUMBER が 1 の場合 ;)

このようなもの (私はあなたが達成したいことを完全には理解していなかったので、これはおそらく 100% 正確ではありません):

WITH r_MyTable
AS
(
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY mon_year ORDER BY p_id, e_id DESC) AS GroupRank
    FROM MyTable
)
UPDATE r_MyTable
SET flag = CASE WHEN GroupRank = 1 THEN 1 ELSE 0 END;
于 2012-10-20T00:30:21.363 に答える
0

これがあなたの目的だと思います。. . 出力はあなたの例と完全に一致します:

declare @t table (p_id int, [year] int, [month] int,  [day] int)
insert @t select 1, 2011, 11, 20
    union select 1, 2011, 11, 21
    union select 1, 2012, 01, 22
    union select 1, 2012, 02, 23
    union select 1, 2012, 02, 24
    union select 1, 2012, 02, 25
    union select 2, 2011, 11, 28
    union select 2, 2011, 11, 29
    union select 2, 2012, 01, 30

select p_id, [year], [month], [day] 
, case when r=1 then 1 else 0 end flag
from
(
    select p_id, [year], [month], [day]
    , row_number() over (partition by p_id, [year], [month] order by [day] desc) r
    from @t
) x
order by  p_id, [year], [month], [day]

出力:

p_id    year    month   day     flag
1       2011    11      20      0
1       2011    11      21      1
1       2012    1       22      1
1       2012    2       23      0
1       2012    2       24      0
1       2012    2       25      1
2       2011    11      28      0
2       2011    11      29      1
2       2012    1       30      1
于 2012-10-20T00:33:54.780 に答える