[解決済み] 各グループの上位1行を取得
2022-03-15 05:31:56
質問
グループごとに最新のエントリーを取得したいテーブルがあります。以下はそのテーブルです。
DocumentStatusLogs
テーブル
|ID| DocumentID | Status | DateCreated |
| 2| 1 | S1 | 7/29/2011 |
| 3| 1 | S2 | 7/30/2011 |
| 6| 1 | S1 | 8/02/2011 |
| 1| 2 | S1 | 7/28/2011 |
| 4| 2 | S2 | 7/30/2011 |
| 5| 2 | S3 | 8/01/2011 |
| 6| 3 | S1 | 8/02/2011 |
によってテーブルがグループ化されます。
DocumentID
でソートされ
DateCreated
を降順で表示します。各
DocumentID
最新のステータスを取得したい。
私の希望する出力です。
| DocumentID | Status | DateCreated |
| 1 | S1 | 8/02/2011 |
| 2 | S3 | 8/01/2011 |
| 3 | S1 | 8/02/2011 |
-
各グループから上位のみを取得する集計関数はありますか?擬似コード参照
GetOnlyTheTop
の下にあります。SELECT DocumentID, GetOnlyTheTop(Status), GetOnlyTheTop(DateCreated) FROM DocumentStatusLogs GROUP BY DocumentID ORDER BY DateCreated DESC
-
もしそのような関数がない場合、私が望む出力を実現する方法はありますか?
-
あるいはそもそも、データベースの非正規化が原因なのでしょうか?私が考えているのは、私が探しているのは1行だけなので、次のようにすればいいのではないかということです。
status
も親テーブルにあるのでしょうか?
詳しくは、親テーブルをご覧ください。
現在
Documents
テーブル
| DocumentID | Title | Content | DateCreated |
| 1 | TitleA | ... | ... |
| 2 | TitleB | ... | ... |
| 3 | TitleC | ... | ... |
親テーブルはこのようにすれば、簡単にそのステータスにアクセスできるでしょうか?
| DocumentID | Title | Content | DateCreated | CurrentStatus |
| 1 | TitleA | ... | ... | s1 |
| 2 | TitleB | ... | ... | s3 |
| 3 | TitleC | ... | ... | s1 |
アップデイト このような問題に簡単に対処できる "apply" の使い方を覚えました。
解決するには?
;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つを選びます。一日に両方のエントリを取得するには、代わりに DENSE_RANK を使用します。
正規化するかしないかについては、あなたが望むかどうかによります。
- 2か所でステータスを維持する
- ステータス履歴の保存
- ...
現状では、ステータスの履歴を保存しています。もし、親テーブルにも最新のステータスを表示したい場合(これは非正規化です)、親に "status" を維持するトリガーが必要になります。
関連
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] データベース内の全テーブルのサイズを取得する
-
[解決済み] 複数の列でgroup byを使用する
-
[解決済み] SQL Server - 挿入された行のIDを取得するための最良の方法は?
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] TSQLを使用してデータベース内のすべてのテーブルのリストを取得するにはどうすればよいですか?
-
[解決済み] SQL Serverでテーブルからカラム名を取得するにはどうすればよいですか?
-
[解決済み] 最初の行への結合方法
-
[解決済み] SQL Server 2008を使用してIDENTITY_INSERTをオン/オフする方法は?
-
[解決済み] グループ化された結果の各グループの上位nレコードを取得する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
SQL-初心者のためのベスト入門SQLクエリ I
-
[解決済み] 指定されたスキーマにテーブルが存在するかどうかを確認する方法
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] SQLのIN句をパラメータ化する
-
[解決済み] SQLの複数列の順序付け
-
[解決済み] SQL ServerにおけるINSERT OR UPDATEに関する解決策
-
[解決済み] SQL Serverには、.NETのMath.Maxのような2つの値を取るMax関数はありますか?
-
[解決済み] SQL Serverで結果をページ分割する最も良い方法は何ですか?
-
[解決済み] SQL ServerでGROUP BYを使って文字列を連結する方法とは?
-
[解決済み] Selectステートメントで特定のフィールドの重複を検索する