サーチ…
すべての行に選択された合計行を追加する
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