MW211 EXIT

devlog
PostgreSQL/今日まで連続して…(2)
2012年08月15日
この前の命題の続き。
まず、連続日数を算出してから、判定。
これなら速いしすっきりする。
┌──────────────────────────────────────┐
│SELECT 表.キー1,                                                            │
│       表.キー2                                                             │
│    FROM (SELECT 表.キー1,                                                  │
│                 表.キー2,                                                  │
│                 COUNT(*) AS 数                                             │
│              FROM 表                                                       │
│              WHERE 日付 > COALESCE((SELECT MAX(別表名.日付)                │
│                                         FROM 表 AS 別表名                  │
│                                         WHERE 別表名.キー1 =  表.キー1     │
│                                           AND 別表名.キー2 =  表.キー2     │
│                                           AND 別表名.判定  <> TRUE         │
│                                    ),                                      │
│                                    '-infinity'::timestam)                  │
│                AND 表.判定 = TRUE                                          │
│              GROUP BY 表.キー1,                                            │
│                       表.キー2                                             │
│         ) AS 別々表名                                                      │
│    WHERE 数 >= 規定数                                                      │
└──────────────────────────────────────┘

念には念を入れて、MAX()をORDER BYにすると若干速くなる。
┌──────────────────────────────────────┐
│SELECT 表.キー1,                                                            │
│       表.キー2                                                             │
│    FROM (SELECT 表.キー1,                                                  │
│                 表.キー2,                                                  │
│                 COUNT(*) AS 数                                             │
│              FROM 表                                                       │
│              WHERE 日付 > COALESCE((SELECT 別表名.日付                     │
│                                         FROM 表 AS 別表名                  │
│                                         WHERE 別表名.キー1 =  表.キー1     │
│                                           AND 別表名.キー2 =  表.キー2     │
│                                           AND 別表名.判定  <> TRUE         │
│                                         ORDER BY 別表名.日付 DESC          │
│                                         LIMIT 1                            │
│                                    ),                                      │
│                                    '-infinity'::timestam)                  │
│                AND 表.判定 = TRUE                                          │
│              GROUP BY 表.キー1,                                            │
│                       表.キー2                                             │
│         ) AS 別々表名                                                      │
│    WHERE 数 >= 規定数                                                      │
└──────────────────────────────────────┘
分類:PostgreSQL