sql >> データベース >  >> RDS >> PostgreSQL

フラグ変数に基づいてrow_number()シーケンスを中断します

    SQL Serverを想定して、次に例を示します。

    DECLARE @T table (id int, [month] char(3), flag bit)
    
    INSERT INTO @T
    VALUES
    (111, 'jan', 1)
    ,(111, 'feb', 1)
    ,(111, 'mar', 1)
    ,(111, 'apr', 0)
    ,(111, 'may', 0)
    ,(111, 'jun', 1)
    ,(222, 'jan', 1)
    ,(222, 'feb', 1)
    ,(222, 'mar', 0)
    ,(222, 'apr', 0)
    ,(222, 'may', 0)
    ,(222, 'jun', 1)
    
    SELECT
        id
        , [month]
        , flag
        , ROW_NUMBER() OVER (PARTITION BY id, section ORDER BY monthNum) [order]
    FROM
        (
            SELECT
                id
                , [month]
                , monthNum
                , flag
                , SUM(CASE WHEN newValue = 1 THEN 1 ELSE 0 END) OVER (PARTITION BY id ORDER BY monthNum) section
            FROM
                (
                    SELECT
                        id
                        , [month]
                        , monthNum
                        , flag
                        , CASE WHEN LAG(flag, 1, ABS(flag - 1)) OVER (PARTITION BY id ORDER BY monthNum) = flag THEN 0 ELSE 1 END newValue
                    FROM
                        (
                            SELECT
                                id
                                , [month]
                                , MONTH(CAST('1 ' + [month] + ' 17' AS datetime)) monthNum
                                , flag
                            FROM @T
                        ) Q
                ) Q2
        ) Q3
    



    1. PostgreSQL 8.4でクエリの実行時間をログに記録できますか?

    2. 日付と時刻をColdFusionを使用してMySQLに挿入します

    3. PostgreSQL、MS SQL Server、およびMySQLでMOD()を使用して剰余を取得する方法

    4. 2つのクランを互いに等しくしないようにするSQL制約