サーチ…
すべての行に選択された合計行を追加する
SELECT your_columns, COUNT(*) OVER() as Ttl_Rows FROM your_data_set
id | 名 | Ttl_Rows |
---|---|---|
1 | 例 | 5 |
2 | foo | 5 |
3 | バー | 5 |
4 | バズ | 5 |
5 | クックス | 5 |
2つのクエリを使用して行数を取得する代わりに、集計関数をウィンドウ関数として使用し、完全な結果セットをウィンドウとして使用できます。
これは余分な自己結合の複雑さなしに、さらなる計算のためのベースとして使用することができます。
他の行が共通のプロパティを持つ場合にフラグを設定する
私はこのデータを持っているとしましょう:
テーブル項目
id | 名 | タグ |
---|---|---|
1 | 例 | unique_tag |
2 | foo | 単純 |
42 | バー | 単純 |
3 | バズ | こんにちは |
51 | クックス | 世界 |
私はすべての行を取得し、タグが他の行で使用されているかどうかを知りたい
SELECT id, name, tag, COUNT(*) OVER (PARTITION BY tag) > 1 AS flag FROM items
結果は次のようになります。
id | 名 | タグ | フラグ |
---|---|---|---|
1 | 例 | unique_tag | 偽 |
2 | foo | 単純 | 真実 |
42 | バー | 単純 | 真実 |
3 | バズ | こんにちは | 偽 |
51 | クックス | 世界 | 偽 |
データベースにOVERとPARTITIONがない場合、これを使用して同じ結果を得ることができます:
SELECT id, name, tag, (SELECT COUNT(tag) FROM items B WHERE tag = A.tag) > 1 AS flag FROM items A
実行中の合計を取得する
このデータが与えられた場合:
日付 | 量 |
---|---|
2016-03-12 | 200 |
2016-03-11 | -50 |
2016-03-14 | 100 |
2016-03-15 | 100 |
2016-03-10 | -250 |
SELECT date, amount, SUM(amount) OVER (ORDER BY date ASC) AS running
FROM operations
ORDER BY date ASC
あなたを与えるだろう
日付 | 量 | ランニング |
---|---|---|
2016-03-10 | -250 | -250 |
2016-03-11 | -50 | -300 |
2016-03-12 | 200 | -100 |
2016-03-14 | 100 | 0 |
2016-03-15 | 100 | -100 |
複数のグループにまたがってN個の最新の行を取得する
このデータ
ユーザーID | 完了日 |
---|---|
1 | 2016-07-20 |
1 | 2016-07-21 |
2 | 2016-07-20 |
2 | 2016-07-21 |
2 | 2016-07-22 |
;with CTE as
(SELECT *,
ROW_NUMBER() OVER (PARTITION BY User_ID
ORDER BY Completion_Date DESC) Row_Num
FROM Data)
SELECT * FORM CTE WHERE Row_Num <= n
n = 1を使用すると、 user_id
ごとに最新の行が1つ表示されuser_id
。
ユーザーID | 完了日 | Row_Num |
---|---|---|
1 | 2016-07-21 | 1 |
2 | 2016-07-22 | 1 |
LAG()関数を使用して「シーケンス外」レコードを検索する
これらのサンプルデータが与えられた場合:
ID | 状態 | STATUS_TIME | STATUS_BY |
---|---|---|---|
1 | 1 | 2016-09-28-19.47.52.501398 | USER_1 |
3 | 1 | 2016-09-28-19.47.52.501511 | USER_2 |
1 | 三 | 2016-09-28-19.47.52.501517 | USER_3 |
3 | 二 | 2016-09-28-19.47.52.501521 | USER_2 |
3 | 三 | 2016-09-28-19.47.52.501524 | USER_4 |
ID
値で識別される項目は、ステータスをスキップすることなく、 STATUS
'ONE'から 'TWO'に 'THREE'に順番に移動する必要があります。問題は、ルールに違反し、すぐに 'ONE'から 'THREE'に移動するユーザー( STATUS_BY
)の値を見つけることです。
LAG()
分析関数は、各行の前の行の値を返すことで問題を解決するのに役立ちます。
SELECT * FROM (
SELECT
t.*,
LAG(status) OVER (PARTITION BY id ORDER BY status_time) AS prev_status
FROM test t
) t1 WHERE status = 'THREE' AND prev_status != 'TWO'
あなたのデータベースにLAG()がない場合、これを使って同じ結果を得ることができます:
SELECT A.id, A.status, B.status as prev_status, A.status_time, B.status_time as prev_status_time
FROM Data A, Data B
WHERE A.id = B.id
AND B.status_time = (SELECT MAX(status_time) FROM Data where status_time < A.status_time and id = A.id)
AND A.status = 'THREE' AND NOT B.status = 'TWO'
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow