2017-10-11 10 views
1

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の代わりにテーブル全体の合計を返します。この合計作業は、分割されたデータに基づいて行われますが、そうではありません。

答えて

2

私はFirst_Value()でそれをやってわからないんだけど、私はRow_Number()と最初のレコードだけを取って行うことがこれを簡単に見つける:

;With Cte As 
(
    Select T.*, 
      Row_Number() Over (Partition By T.PTORequestId Order By T.PTORequestDetailId) As RN 
    From #TempTable T 
    Join #TempParent P On P.PTORequestId = T.PTORequestId 
) 
Select PTORequestId, DivisionPTOAccrualId As AccruralId 
From Cte 
Where RN = 1 
+0

まず値関数は、本質的に同じことを行います。どのようにすべてを選んだのかで、最初の価値はうまくいきません。私の結合は複数の行を作成します。 –

+0

しかし、これは私の問題を再現する助けになりました。私はこの答を受け入れる前にもう少し研究をする必要がありますが、あなたの権利は行番号 –