繁体   English   中英

SQL从表中获取第一个值

[英]SQL Get First Value From Table

我正在运行MS SQL-Server-2016,正在尝试从对ParentId进行分区的表中获取第一个值。 我有一个像这样的数据集:

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应计ID:139

第一个值应仅返回一个值,而其返回四个值。 为什么会发生这种情况,如何使FIRST_VALUE每行返回一个值?

编辑

我认为这是因为我正在从TempTable中选择FIRST_VALUE,所以它正在为Temp Table中的每一行选择First Value。 但我实际上只做一次

对于需要澄清我在做什么的任何人。 我期待我的分区依据来过滤表中的行。 我假设由于表上的SUM将返回整个表的总和,而不是每行整个表的SUM。 这种总工作是基于分区数据的,不是这种情况。

我不确定使用First_Value()做到这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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM