2017-10-11 185 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 

运行,这将创建一个临时表中的数据集我的工作。 我试图走出的第一个值由#TempTable.PTORequestId划分的DivisionPTOAccrualId,

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 

基本上,我试图让139每排一次从我的父母,但FIRST_VALUE似乎返回多个结果,因此它创建了笛卡尔积。

因此,而不是获取一个单行结果集

PTORequestId:48 AccrualId:139

第一个值应该只返回一个值 然而其返回4个值。 为什么会发生这种情况,我怎样才能让FIRST_VALUE每行返回一个值?

编辑

我认为这正在发生,因为我选择从不是Temptable的FIRST_VALUE,所以它选择的第一个值在临时表的每一行。但我其实只做一次

对于任何需要澄清我做错了什么的人。 我期待我的分区通过筛选表中的行。 我假设,因为表上的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

但是,这帮助我认识到我的问题,我需要做更多的研究,然后才能接受这个答案,但我认为你的权利我需要使用行号 –

相关问题