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

SQL:Last_Value() は間違った結果を返します (ただし、First_Value() は正常に動作します)

    動作を説明する簡単なクエリを次に示します。

    select 
      v,
    
      -- FIRST_VALUE() and LAST_VALUE()
      first_value(v) over(order by v) f1,
      first_value(v) over(order by v rows between unbounded preceding and current row) f2,
      first_value(v) over(order by v rows between unbounded preceding and unbounded following) f3,
      last_value (v) over(order by v) l1,
      last_value (v) over(order by v rows between unbounded preceding and current row) l2,
      last_value (v) over(order by v rows between unbounded preceding and unbounded following) l3,
    
      -- For completeness' sake, let's also compare the above with MAX()
      max        (v) over() m1,
      max        (v) over(order by v) m2,
      max        (v) over(order by v rows between unbounded preceding and current row) m3,
      max        (v) over(order by v rows between unbounded preceding and unbounded following) m4
    from (values(1),(2),(3),(4)) t(v)
     

    上記のクエリの出力は、ここ (SQLFiddle ここ ) で確認できます。 ):

    <プレ>| V | F1 | F2 | F3 | L1 | L2 | L3 | M1 | M2 | M3 | M4 | |---|----|----|----|----|----|----|----|----|----|----| | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 4 | 1 | 1 | 4 | | 2 | 1 | 1 | 1 | 2 | 2 | 4 | 4 | 2 | 2 | 4 | | 3 | 1 | 1 | 1 | 3 | 3 | 4 | 4 | 3 | 3 | 4 | | 4 | 1 | 1 | 1 | 4 | 4 | 4 | 4 | 4 | 4 | 4 |

    ORDER BY を取るウィンドウ関数に適用される暗黙的なフレームについて考える人はほとんどいません。 句。この場合、ウィンドウはフレーム RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW にデフォルト設定されます . (RANGE は ROWS とまったく同じではありませんが、それは別の話です)。このように考えてみてください:

    • v = 1 の行 順序付けられたウィンドウのフレームが v IN (1) にまたがる
    • v = 2 の行 順序付けられたウィンドウのフレーム範囲 v IN (1, 2)
    • v = 3 の行 順序付けられたウィンドウのフレーム範囲は v IN (1, 2, 3) です
    • v = 4 の行 順序付けられたウィンドウのフレーム範囲は v IN (1, 2, 3, 4) です

    その動作を防止したい場合は、次の 2 つのオプションがあります:

    • 明示的な ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING を使用する ordered の句 ウィンドウ関数
    • ORDER BY を使用しない それらを省略できるウィンドウ関数の句 (MAX(v) OVER() として) )

    詳細は LEAD() に関するこの記事 、 LAG() , FIRST_VALUE() および LAST_VALUE()



    1. 警告:mysql_num_rows()は、パラメーター1がリソースであると想定しています。ブール値が指定されています

    2. Zend_Auth_Adapter_DbTableに指定されたパラメーターは、有効なSQLステートメントを生成できませんでした

    3. ワイルドカードを使用してPostgreSQLで複数のテーブルを削除する方法

    4. クエリで間隔を指定してprepareStatementを使用するとエラーが発生する