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

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


2
タイムスタンプに基づくウィンドウオフセット
ソーシャルフィードの結果をページングするために使用するクエリを書いています。コンセプトは、モバイルアプリがN個のアイテムをリクエストし、@CutoffTime以下で呼び出した開始日時を提供することです。カットオフ時間の目的は、ページングウィンドウをいつ開始するかを確立することです。行オフセットの代わりにタイムスタンプを使用している理由は、新しいソーシャルコンテンツが追加された場合でも、古い投稿を取得するときに、一貫した場所からタイムスタンプを使用できるようにするためです。 ソーシャルフィードアイテムは自分または友達からのものである可能性があるUNIONため、これら2つのグループの結果を組み合わせるためにa を使用しています。もともと私はTheQuery_CTEなしでロジックを試しました、UNIONそしてそれは遅い犬でした。 これは私がやったことです(関連するテーブルスキーマを含む): CREATE TABLE [Content].[Photo] ( [PhotoId] INT NOT NULL PRIMARY KEY IDENTITY (1, 1), [Key] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(), [FullResolutionUrl] NVARCHAR(255) NOT NULL, [Description] NVARCHAR(255) NULL, [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(), ); CREATE TABLE [Content].[UserPhotoAssociation] ( [PhotoId] INT NOT NULL, [UserId] INT NOT NULL, [ShowInSocialFeed] …

1
SQL Serverクエリの動作が、UPDATEとSELECTで異なるのはなぜですか?
フィールドでパーティション分割した後、レコードを連続番号に更新するSQL Serverクエリを作成しました。SELECTステートメントとして実行すると、すべてが見栄えがします。 DECLARE @RunDetailID INT = 448 DECLARE @JobDetailID INT SELECT @JobDetailID = [JobDetailID] FROM [RunDetails] WHERE [RunDetailID] = @RunDetailID SELECT [OrderedRecords].[NewSeq9], RIGHT([OrderedRecords].[NewSeq9], 4) FROM ( SELECT [Records].*, [Records].[SortField] + RIGHT('0000' + CAST(ROW_NUMBER() OVER(PARTITION BY [Records].[SortField] ORDER BY [Records].[RunDetailID], [Records].[SortField], [Records].[PieceID]) AS VARCHAR), 4) NewSeq9 FROM ( SELECT [MRDFStorageID], [RunDetailID], …

2
ウィンドウ関数は、外部パラメーター化された 'where'句を含むビューから呼び出されると、ひどい実行プランを引き起こします
私はずっと前にこの問題を抱えていましたが、自分に合った回避策を見つけ、それを忘れていました。 しかし、今はその問題がSOにあるので、この問題を取り上げるつもりです。 非常に簡単な方法(注文+注文明細)でいくつかのテーブルを結合するビューがあります。 where句なしでクエリを実行すると、ビューは数百万行を返します。 しかし、誰もそれをそのように呼ぶことはありません。通常のクエリは select * from that_nasty_view where order_number = 123456; これは、5分のうち約10レコードを返します。 重要なこと:ビューにはウィンドウ関数が含まれています。ウィンドウ関数はrank()、ビューが常に照会されるフィールドによって正確に分割されます。 rank() over (partition by order_number order by detail_line_number) さて、このビューがクエリ文字列のリテラルパラメータでクエリされた場合、上記とまったく同じように、ビューは即座に行を返します。実行計画は問題ありません: インデックスを使用して両方のテーブルのインデックスシークorder_number(10行を返します)。 返された小さな結果に対するウィンドウの計算。 選択。 ただし、ビューがパラメーター化された方法で呼び出されると、状況が悪化します。 Index scanインデックスを無視してすべてのテーブルで。5m行を返します。 巨大な参加。 すべてpartitionのsのウィンドウを計算しています(約500kウィンドウ)。 Filter 5mから10列を取る。 選択する これは、パラメーターが関係するすべての場合に発生します。それはSSMSである場合もあります: declare @order_number int = 123456; select * from that_nasty_view where order_number = @order_number; これは、ExcelなどのODBCクライアントにすることができます。 …

3
グループの列ごとに最後の非NULL値のセットを選択するにはどうすればよいですか?
SQL Server 2016を使用していますが、使用しているデータは次の形式です。 CREATE TABLE #tab (cat CHAR(1), t CHAR(2), val1 INT, val2 CHAR(1)); INSERT INTO #tab VALUES ('A','Q1',2,NULL),('A','Q2',NULL,'P'),('A','Q3',1,NULL),('A','Q3',NULL,NULL), ('B','Q1',5,NULL),('B','Q2',NULL,'P'),('B','Q3',NULL,'C'),('B','Q3',10,NULL); SELECT * FROM #tab; 列の最後のnull以外の値を取得し、val1でval2グループ化catおよび順序付けしたいのtですが。私が求めている結果は cat val1 val2 A 1 P B 10 C 私が来た最も近いものは、順序付けられた最後の非null値が必要なので、機能しないものLAST_VALUEを無視しながら使用してORDER BYいます。 SELECT DISTINCT cat, LAST_VALUE(val1) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val1, …

5
ウィンドウ関数を使用したサブクエリの最適化
私のパフォーマンスチューニングのスキルを十分に感じるように見えることはありませんようがあれば、私はいつも疑問に思うより多くの私はいくつかのクエリに対して実行することができ、最適化が。この質問が関係する状況は、サブクエリ内にネストされたウィンドウ化MAX関数です。 私が調べているデータは、より大きなセットのさまざまなグループでの一連のトランザクションです。重要なフィールドは4つあります。トランザクションの一意のID、トランザクションのバッチのグループID、およびそれぞれの一意のトランザクションまたはトランザクションのグループに関連付けられた日付です。ほとんどの場合、グループの日付はバッチの最大一意のトランザクションの日付と一致しますが、システムで手動調整が行われ、グループのトランザクションの日付がキャプチャされた後に一意の日付の操作が発生する場合があります。この手動編集では、グループの日付は意図的に調整されません。 このクエリで特定するのは、一意の日付がグループの日付の後にあるレコードです。次のサンプルクエリは、私のシナリオにほぼ相当するものを構築し、SELECTステートメントは探しているレコードを返しますが、このソリューションに最も効率的な方法でアプローチしていますか?これは、ファクトテーブルの読み込み中にレコードが上位9桁の数を数えるため、実行に時間がかかりますが、ほとんどの場合、サブクエリを無視することで、ここにもっと良いアプローチがあるかどうか疑問に思います。インデックスは既に用意されていると確信しているので、インデックスについては心配していません。私が探しているのは、同じことを実現するが、さらに効率的な代替のクエリアプローチです。どんなフィードバックでも大歓迎です。 CREATE TABLE #Example ( UniqueID INT IDENTITY(1,1) , GroupID INT , GroupDate DATETIME , UniqueDate DATETIME ) CREATE CLUSTERED INDEX [CX_1] ON [#Example] ( [UniqueID] ASC ) SET NOCOUNT ON --Populate some test data DECLARE @i INT = 0, @j INT = 5, @UniqueDate DATETIME, @GroupDate DATETIME …

4
数百万行の分類されたデータやSQLマジックを保存しますか?
私のDBAの経験は、単純なストレージ+ CMSスタイルのデータの取得よりもはるかに進んでいないため、これはばかげた質問かもしれませんが、わかりません! 特定のグループサイズと特定の期間内の特定の日数の休日価格を検索または計算する必要があるという問題があります。例えば: 1月のいつでも2人で4泊できるホテルの部屋はいくらですか。 たとえば、5000のホテルの料金と空き状況のデータは次のように保存されています。 Hotel ID | Date | Spaces | Price PP ----------------------------------- 123 | Jan1 | 5 | 100 123 | Jan2 | 7 | 100 123 | Jan3 | 5 | 100 123 | Jan4 | 3 | 100 123 | Jan5 | 5 | 100 …

3
Microsoft SQL Server 2008では、構文により「Parallel Data Warehouse(PDW)機能が有効になっていません」というエラーが生成されます。
並べ替えられたパーティションの集計から生成された次の仮想列があります。 MIN(picture_id) OVER ( PARTITION BY [360_set] ORDER BY picture_id ASC ) しかし、それを実行すると、次のようになります。 Msg 11305, Level 15, State 10, Line 12 The Parallel Data Warehouse (PDW) features are not enabled. これは興味深いところですが、パーティションに並べ替え順序がなくても機能します。 MIN(picture_id) OVER ( PARTITION BY [360_set] ) さらに、ROW_NUMBER()ウィンドウ関数(集計関数ではない)は、パーティションで明示的な順序で動作します。 ROW_NUMBER() OVER ( PARTITION BY [360_set] ORDER BY picture_id ASC ) …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.