タグ付けされた質問 「window-functions」

結果セットを分割し、そのパーティション内のデータをロールアップせずに、そのパーティション内で何かを計算する関数。

6
ウィンドウ関数を使用した日付範囲のローリングサム
日付範囲でローリングサムを計算する必要があります。説明するために、AdventureWorksサンプルデータベースを使用して、次の仮想構文で必要なことを正確に実行できます。 SELECT TH.ProductID, TH.TransactionDate, TH.ActualCost, RollingSum45 = SUM(TH.ActualCost) OVER ( PARTITION BY TH.ProductID ORDER BY TH.TransactionDate RANGE BETWEEN INTERVAL 45 DAY PRECEDING AND CURRENT ROW) FROM Production.TransactionHistory AS TH ORDER BY TH.ProductID, TH.TransactionDate, TH.ReferenceOrderID; 悲しいことに、RANGEウィンドウフレーム範囲は現在SQL Serverで間隔を許可していません。 サブクエリと通常の(非ウィンドウ)集計を使用してソリューションを作成できることを知っています。 SELECT TH.ProductID, TH.TransactionDate, TH.ActualCost, RollingSum45 = ( SELECT SUM(TH2.ActualCost) FROM Production.TransactionHistory AS TH2 …

2
MySQLおよびウィンドウ関数
MySQLウィンドウ関数をサポートしていないようです。 たとえば、シンプル:COUNT(*) OVER() AS cnt動作しません。 これが商用バージョンにも当てはまるかどうかはわかりません(コミュニティバージョンは限定的なサブセットであると想定しています)。 そうでない場合、この欠落機能をどのように回避しますか?

4
結果を最初の2つのランキング行に制限する
SQL Server 2008では、を使用RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)してデータセットを返すために使用していRANKます。ただし、各パーティションには数百のレコードがあるため、ランク1、2、3 ...... 999から値を取得します。しかし、私RANKsはそれぞれ2つまでしかしたくないPARTITION。 例: ID Name Score Subject 1 Joe 100 Math 2 Jim 99 Math 3 Tim 98 Math 4 Joe 99 History 5 Jim 100 History 6 Tim 89 History 7 Joe 80 Geography 8 Tim 100 Geography …

4
OVERを使用したウィンドウ関数でのDISTINCTの使用
OracleからSQL Server 2014にクエリを移行しようとしています。 Oracleでうまく機能するクエリを次に示します。 select count(distinct A) over (partition by B) / count(*) over() as A_B from MyTable これは、SQL Server 2014でこのクエリを実行しようとした後に取得したエラーです。 Use of DISTINCT is not allowed with the OVER clause 誰が問題を知っていますか?SQL Serverではこのような種類のクエリが可能ですか?お知らせ下さい。

6
表から「n」個の連続した無料番号を見つける
このような数字のテーブルがあります(ステータスはFREEまたはASSIGNEDです) id_set番号ステータス ----------------------- 1 000001割り当て済み 1 000002無料 1 000003割り当て済み 1 000004無料 1 000005無料 1 000006割り当て済み 10007割り当て済み 1 000008無料 1 000009無料 1 000010無料 1 000011割り当て済み 1 000012割り当て済み 1 000013割り当て済み 1 000014無料 1 000015割り当て済み 「n」個の連続した番号を見つける必要があるため、n = 3の場合、クエリは 1 000008無料 1 000009無料 1 000010無料 各id_setの最初の可能なグループのみを返す必要があります(実際、クエリごとにid_setに対してのみ実行されます) 私はWINDOW関数をチェックしてCOUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING)いましたが、のようなクエリをいくつか試しましたが、それだけでした:) …

1
前の行までの合計
ウィンドウ関数に関するヘルプが必要です。ウィンドウ内の合計とウィンドウ内の現在の合計を計算できることを知っています。しかし、前の現在の合計、つまり現在の行を含まない現在の合計を計算することはできますか? ROWまたはRANGE引数を使用する必要があると思います。私はCURRENT ROWオプションがあることを知っていますが、私CURRENT ROW - 1は無効な構文である必要があります。ROWとのRANGE議論に関する私の知識は限られているので、どんな助けもありがたいことに受けます。 私は、この問題に対する多くのソリューションがあることを知っているが、私は理解しているよROW、RANGE引数を、私はこの問題は、これらにひび割れすることが可能と仮定します。以前の実行中の合計を計算する1つの可能な方法を含めましたが、もっと良い方法があるのではないかと思います。 USE AdventureWorks2012 SELECT s.SalesOrderID , s.SalesOrderDetailID , s.OrderQty , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID) AS RunningTotal , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID ORDER BY SalesOrderDetailID) - s.OrderQty AS PreviousRunningTotal -- Sudo code - I know this does not work --, SUM(s.OrderQty) OVER (PARTITION …

7
グループ化またはウィンドウ
ウィンドウ関数を使用して解決できると思う状況がありますが、よくわかりません。 次の表を想像してください CREATE TABLE tmp ( date timestamp, id_type integer ) ; INSERT INTO tmp ( date, id_type ) VALUES ( '2017-01-10 07:19:21.0', 3 ), ( '2017-01-10 07:19:22.0', 3 ), ( '2017-01-10 07:19:23.1', 3 ), ( '2017-01-10 07:19:24.1', 3 ), ( '2017-01-10 07:19:25.0', 3 ), ( '2017-01-10 07:19:26.0', 5 ), …


1
2つのイベントテーブルを1つのタイムラインにまとめる
2つのテーブルがある場合: CREATE TABLE foo (ts timestamp, foo text); CREATE TABLE bar (ts timestamp, bar text); 私はのための戻り値というクエリを書きたいts、fooとbarその直近の値の統一見解を表しています。つまり、foo含まれている場合: ts | foo -------- 1 | A 7 | B そしてbar含まれています: ts | bar -------- 3 | C 5 | D 9 | E 私は返すクエリが必要です: ts | foo | bar -------------- 1 | A …

2
最長連続シーケンスを選択
特定の列の連続する行の最長シーケンスを取得するPostgreSQL 9.0でクエリを作成しようとしています。 次の表を考慮してください。 lap_id (serial), lap_no (int), car_type (enum), race_id (int FK) どこlap_noがそれぞれに一意です(race_id, car_type)。 クエリで指定されたrace_idandの最長のシーケンスを生成car_typeしたいので、int最高の(または長い)を返します。 次のデータで: 1, 1, red, 1 2, 2, red, 1 3, 3, red, 1 4, 4, red, 1 5, 1, blue, 1 6, 5, red, 1 7, 2, blue, 1 8, 1, green, 1 car_type = …

2
ウィンドウ関数を使用して、パーティション内の最初の非null値を繰り越します
訪問を記録するテーブルを考えます create table visits ( person varchar(10), ts timestamp, somevalue varchar(10) ) このサンプルデータを検討してください(カウンターとして簡略化されたタイムスタンプ) ts| person | somevalue ------------------------- 1 | bob |null 2 | bob |null 3 | jim |null 4 | bob | A 5 | bob | null 6 | bob | B 7 | jim | X …

1
バッチモードのウィンドウ集計で算術オーバーフローが発生するのはなぜですか?
次のクエリは、SUM列ストアテーブルに対してウィンドウ処理を実行します1500 total rows。それぞれの値は0または1であり、INTデータ型をオーバーフローします。なんでこんなことが起こっているの? SELECT a, p, s, v, m, n, SUM(CASE WHEN n IS NULL THEN 0 ELSE 1 END) OVER (PARTITION BY s, v, a ORDER BY p) AS lastNonNullPartition FROM ( SELECT a, p, s, v, m, n, RANK() OVER (PARTITION BY v, s, a, p ORDER BY …

1
Postgresでウィンドウ関数の集計を取得するにはどうすればよいですか?
次のように、整数配列の置換/組み合わせの2つの列を含むテーブルと、値を含む3番目の列があります。 CREATE TABLE foo ( perm integer[] NOT NULL, combo integer[] NOT NULL, value numeric NOT NULL DEFAULT 0 ); INSERT INTO foo VALUES ( '{3,1,2}', '{1,2,3}', '1.1400' ), ( '{3,1,2}', '{1,2,3}', '0' ), ( '{3,1,2}', '{1,2,3}', '1.2680' ), ( '{3,1,2}', '{1,2,3}', '0' ), ( '{3,1,2}', '{1,2,3}', '1.2680' ), ( …

4
列を合計して個別のバケットを作成するウィンドウクエリを作成するにはどうすればよいですか?
次のような10進値の列を含むテーブルがあります。 id value size -- ----- ---- 1 100 .02 2 99 .38 3 98 .13 4 97 .35 5 96 .15 6 95 .57 7 94 .25 8 93 .15 私が成し遂げる必要があることは、説明するのが少し難しいので、ご容赦ください。私がやろうとしているのは、size列の集計値を作成することvalueです。これは、に従って降順で、前の行の合計が1になるたびに1ずつ増加します。結果は次のようになります。 id value size bucket -- ----- ---- ------ 1 100 .02 1 2 99 .38 1 3 98 …

1
結合とウィンドウ関数を使用してリード値とラグ値を取得するパフォーマンスの比較
私は20Mの行のテーブルを有し、各行は3つの列を有している:time、id、およびvalue。それぞれについてidとtime、そこにあるvalue状態のため。time特定の特定の特定のリードとラグの値を知りたいid。 これを達成するために2つの方法を使用しました。1つの方法は結合を使用し、もう1つの方法は、クラスター化インデックスがオンtimeおよびのウィンドウ関数lead / lagを使用することidです。 これら2つの方法のパフォーマンスを実行時間で比較しました。結合メソッドは16.3秒かかり、ウィンドウ関数メソッドは20秒かかります(インデックスの作成時間は含まれません)。結合メソッドがブルートフォースであるときにウィンドウ関数が進んでいるように見えるので、これは私を驚かせました。 2つのメソッドのコードは次のとおりです。 インデックスを作成 create clustered index id_time on tab1 (id,time) 結合方法 select a1.id,a1.time a1.value as value, b1.value as value_lag, c1.value as value_lead into tab2 from tab1 a1 left join tab1 b1 on a1.id = b1.id and a1.time-1= b1.time left join tab1 c1 on a1.id = c1.id …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.