MS SQL Server 2016を実行しています。ParentIdをパーティション化したテーブルから最初の値を取得しようとしています。私は次のようなデータセットを持っています:SQLテーブルから最初の値を取得
CREATE TABLE #TempTable
(
PTORequestDetailId INT,
PTORequestId INT,
DivisionPTOAccrualId INT,
RequestDate DATE,
StartTime DateTime,
Hours Decimal(19,2),
ResponseNotes nvarchar(500),
Status int,
CreatedOn DateTime,
ModifiedOn DateTime
)
INSERT INTO #TempTable
SELECT 60, 48, 139, '2015-09-09', '2015-09-08 20:00:00.000', 8.00,'',0, '2015-09-09 13:30:40.363', '2015-09-09 13:30:40.313' UNION
SELECT 61, 48, 139, '2015-09-10', '2015-09-09 20:00:00.000', 8.00,'',0, '2015-09-09 13:30:40.363', '2015-09-09 13:30:40.313' UNION
SELECT 62, 48, 139, '2015-09-11', '2015-09-10 20:00:00.000', 8.00,'',0, '2015-09-09 13:30:40.363', '2015-09-09 13:30:40.313' UNION
SELECT 63, 48, 139, '2015-09-13', '2015-09-12 20:00:00.000', 8.00,'',0, '2015-09-09 13:30:40.363', '2015-09-09 13:30:40.313' UNION
CREATE TABLE #TempParent
(
PTORequestId INT,
)
INSERT INTO #TempParent
SELECT 48
これを実行すると、私が作業しているデータセットで一時テーブルが作成されます。 私は基本的に私の親から一度行あたり139
を取得しようとしているが、FIRST_VALUEを返すように思わ
SELECT #TempParent.*, AccrualDetails.*
FROM #TempParent
CROSS APPLY (
SELECT FIRST_VALUE(#TempTable.DivisionPTOAccrualId)
OVER (PARTITION BY #TempTable.PTORequestId
ORDER BY #TempTable.PTORequestDetailId ASC
ROWS UNBOUNDED PRECEDING
) as AccrualId
FROM #TempTable
WHERE #TempTable.PTORequestId = #TempParent.PTORequestId
) as AccrualDetails
、#1 TempTable.PTORequestIdで仕切らDivisionPTOAccrualIdの最初の値を取得しようとしています複数の結果が得られ、デカルト積が生成されます。 48 AccrualId:139
最初の値のみ、その4つの値を返すさらに単一の値 を返すべき
だからではなく、単一の行結果の取得は
にPTORequestIdを設定します。 これはなぜ発生するのですか。FIRST_VALUEを1行につき1つの値に戻すにはどうすればよいですか?
EDIT
私はTempTableのからFIRST_VALUEを選択していますので、これは発生していると思うので、それは一時テーブルの各行の最初の値を選択します。しかし、私は実際に一度だけそれを行うには
私が間違っていたことを明確にする必要がある人のために。 テーブルの行をフィルタリングするために私のパーティションを期待していました。 テーブル上のSUMは、テーブル全体のSUMの代わりにテーブル全体の合計を返します。この合計作業は、分割されたデータに基づいて行われますが、そうではありません。
まず値関数は、本質的に同じことを行います。どのようにすべてを選んだのかで、最初の価値はうまくいきません。私の結合は複数の行を作成します。 –
しかし、これは私の問題を再現する助けになりました。私はこの答を受け入れる前にもう少し研究をする必要がありますが、あなたの権利は行番号 –