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

各グループの上位1行を取得

    ;WITH cte AS
    (
       SELECT *,
             ROW_NUMBER() OVER (PARTITION BY DocumentID ORDER BY DateCreated DESC) AS rn
       FROM DocumentStatusLogs
    )
    SELECT *
    FROM cte
    WHERE rn = 1
    

    1日に2つのエントリが予想される場合、これは任意に1つを選択します。 1日の両方のエントリを取得するには、代わりにDENSE_RANKを使用します

    正規化されているかどうかは、次のようにするかどうかによって異なります。

    • 2か所でステータスを維持する
    • ステータス履歴を保持する
    • ...

    現状では、ステータス履歴を保持します。親テーブルにも最新のステータス(非正規化)が必要な場合は、親の「ステータス」を維持するためのトリガーが必要になります。または、このステータス履歴テーブルを削除してください。



    1. MariaDBでのTIME_FORMAT()のしくみ

    2. パフォーマンスが低下し始める前に、MySQLデータベースはどのくらい大きくなることができますか

    3. スプレッドシートとデータベース:切り替える時が来ましたか?パート1

    4. 衝突することなくランダムな整数を生成する