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

ウィンドウ関数:last_value(ORDER BY ... ASC)last_value(ORDER BY ... DESC)と同じ

    LAST_VALUE()の問題 ウィンドウ句のデフォルトのルールは、本当に必要な値を削除するということです。これは非常に微妙な問題であり、この機能をサポートするすべてのデータベースに当てはまります。

    これはOracleブログからのものです:

    ウィンドウ句のトピックに取り組んでいる間、FIRST関数とLAST関数の暗黙的で変更不可能なウィンドウ句は、UNDOUNDEDPRECEDINGとUNBOUNDEDFOLLOWINGの間、つまりパーティション内のすべての行です。 FIRST_VALUEとLAST_VALUEの場合、デフォルトで変更可能なウィンドウ句はROWS BETWEEN UNBOUNDED PRECEDINGAND CURRENT ROWです。つまり、現在の行の後の行を除外します。リストの最初の行を探しているときに、リストの一番下から行を削除しても違いはありません( FIRST_VALUE)ただし、リストの最後の行を検索する場合は違いがあります(LAST_VALUE)通常、LAST_VALUEを使用する場合は、ROWS BETWEENUNBOUNDEDPRECEDINGとUNBOUNDEDFOLLOWINGを明示的に指定するか、FIRST_VALUEを使用して並べ替え順序を逆にする必要があります。 。

    したがって、FIRST_VALUE()を使用するだけです。 。これはあなたが望むことをします:

    with test (id, session_ID, value) as (
          (VALUES (0, 2, 100),
                  (1, 2, 120),
                  (2, 2, 140),
                  (3, 1, 900),
                  (4, 1, 800),
                  (5, 1, 500)
          )
         )
    select id,
           first_value(value) over (partition by session_ID order by id) as first_value_window,
           first_value(value) over (partition by session_ID order by id desc) as first_value_window_desc
    from test
    order by id
    


    1. 行が存在する場合はIDを返し、存在しない場合はINSERTを返します

    2. MicrosoftAccessがスタートアップに最適な5つの理由

    3. ISNUMERIC('。')が1を返すのはなぜですか?

    4. MySQLポートアクセスを制限する方法