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

SQLで連続する時間間隔をグループ化する

    PL/pgSQLでは変数を問題なく使用できます。

    これはテーブル関数で解決します。

    テーブルがstockと呼ばれると仮定します 、私のコードは次のようになります:

    CREATE OR REPLACE FUNCTION combine_periods() RETURNS SETOF stock
       LANGUAGE plpgsql STABLE AS
    $$DECLARE
       s stock;
       period stock;
    BEGIN
       FOR s IN
          SELECT stock_name, action, start_date, end_date
          FROM stock
          ORDER BY stock_name, action, start_date
       LOOP
          /* is this a new period? */
          IF period IS NOT NULL AND
             (period.stock_name <> s.stock_name
                OR period.action <> s.action
                OR period.end_date <> s.start_date)
          THEN
             /* new period, output last period */
             RETURN NEXT period;
             period := NULL;
          ELSE
             IF period IS NOT NULL
             THEN
                /* period continues, update end_date */
                period.end_date := s.end_date;
             END IF;
          END IF;
    
          /* remember the beginning of a new period */
          IF period IS NULL
          THEN
             period := s;
          END IF;
       END LOOP;
    
       /* output the last period */
       IF period IS NOT NULL
       THEN
          RETURN NEXT period;
       END IF;
    
       RETURN;
    END;$$;
    

    そして、私はそれを次のように呼びます:

    test=> SELECT * FROM combine_periods();
    ┌────────────┬─────────┬────────────┬──────────┐
    │ stock_name │ action  │ start_date │ end_date │
    ├────────────┼─────────┼────────────┼──────────┤
    │ google     │ falling │          3 │        4 │
    │ google     │ growing │          1 │        3 │
    │ google     │ growing │          4 │        5 │
    │ yahoo      │ growing │          1 │        2 │
    └────────────┴─────────┴────────────┴──────────┘
    (4 rows)
    



    1. 注文を保存するにはどうすればよいですか?

    2. PDOプリペアドステートメントから生のSQLクエリ文字列を取得する

    3. sysdateに基づくトリガー

    4. OpenCart:oc_category_pathに正確に入力する方法