Sql Server:获取给定数据后的第一行
我正在准备使用SQL Server从数据库中获取数据的查询。请在下面查询。这里有一张桌子。此表包含员工的当前状态。AssociateStatus_HST表包含所有状态更改。我希望在[状态更改日期]列中显示状态更改日期 通过我的查询,我将获得状态3之后的所有更新日期。但我只想要下一个更新日期。请注意,状态更改可以按任何顺序进行Sql Server:获取给定数据后的第一行,sql,sql-server,Sql,Sql Server,我正在准备使用SQL Server从数据库中获取数据的查询。请在下面查询。这里有一张桌子。此表包含员工的当前状态。AssociateStatus_HST表包含所有状态更改。我希望在[状态更改日期]列中显示状态更改日期 通过我的查询,我将获得状态3之后的所有更新日期。但我只想要下一个更新日期。请注意,状态更改可以按任何顺序进行 SELECT AssociateId,[Status], UpdatedAt, ASH.UpdatedAt AS [Status Changed Dat
SELECT
AssociateId,[Status], UpdatedAt,
ASH.UpdatedAt AS [Status Changed Date]
FROM
AssociateStatus_HST AST
LEFT OUTER JOIN
(SELECT
ProposalBidId,UpdatedAt
FROM
AssociateStatus_HST) ASH ON (ASH.StatusID = AST.StatusID AND ASH.UpdatedAt > AST.UpdatedAt)
WHERE
[Status] = 3
此查询的示例输出:
AssociateId Status UpdatedAt Status Changed Date
--------------------------------------------------------
1234 3 21-1-19 24-1-19
1234 3 21-1-19 27-1-19
4567 3 20-1-19 25-1-19
预期产量
AssociateId Status UpdatedAt Status Changed Date
--------------------------------------------------------
1234 3 21-1-19 24-1-19
4567 3 20-1-19 25-1-19
您可以尝试使用行数函数
尝试在不使用子查询的情况下使用分组依据:
SELECT
AssociateId,
[Status],
Max( UpdatedAt) UpdatedAt,
Min(ASH.UpdatedAt) AS [Status Changed Date]
FROM AssociateStatus_HST AST
LEFT OUTER JOIN AssociateStatus_HST ASH
ON
ASH.StatusID = AST.StatusID and ASH.UpdatedAt > AST.UpdatedAt
WHERE [Status] = 3
GROUP BY AssociateId, Status
还有一个例子,我将日期修改为ANSI格式:
DECLARE @FooTable TABLE
(
AssociateId INT,
Status INT,
UpdatedAt VARCHAR(50),
StatusChangedDate VARCHAR(50)
)
INSERT INTO @FooTable
(
AssociateId,
Status,
UpdatedAt,
StatusChangedDate
)
VALUES
(1234, 3, '2019-21-1', '2019-1-24')
, ( 1234, 3, '2019-19-1', '2019-1-19')
, (4567, 3, '2019-1-19', '2019-1-25')
SELECT
ft.AssociateId
, ft.Status
, MAX(ft.UpdatedAt) UpdatedAt
, MIN(ft.StatusChangedDate) StatusChangedDate
FROM @FooTable ft
GROUP BY ft.AssociateId, ft.Status
输出:
AssociateId Status UpdatedAt StatusChangedDate
1234 3 2019-21-1 2019-1-19
4567 3 2019-1-19 2019-1-25
使用行数窗口功能
with cte as (
SELECT
AssociateId,[Status],UpdatedAt, ASH.UpdatedAt AS [Status Changed Date]
,row_number() over(partition by AssociateId,[Status] order by ASH.UpdatedAt) rn
FROM AssociateStatus_HST AST
LEFT OUTER JOIN (
SELECT
ProposalBidId,UpdatedAt
FROM
AssociateStatus_HST
) ASH
ON (
ASH.StatusID = AST.StatusID and ASH.UpdatedAt > AST.UpdatedAt
)
WHERE [Status] = 3
) select * from cte where rn=1
您可以使用应用程序:
共享示例数据及其应用程序output@ZaynulAbadinTuhin添加的示例数据仅使用MINASH.UpdatedAt通过AssociatedThis在分区上执行此操作不会对status=3进行任何筛选。@GordonLinoff。非常感谢。
with cte as (
SELECT
AssociateId,[Status],UpdatedAt, ASH.UpdatedAt AS [Status Changed Date]
,row_number() over(partition by AssociateId,[Status] order by ASH.UpdatedAt) rn
FROM AssociateStatus_HST AST
LEFT OUTER JOIN (
SELECT
ProposalBidId,UpdatedAt
FROM
AssociateStatus_HST
) ASH
ON (
ASH.StatusID = AST.StatusID and ASH.UpdatedAt > AST.UpdatedAt
)
WHERE [Status] = 3
) select * from cte where rn=1
SELECT AST.*, ASH.*
FROM AssociateStatus_HST AST OUTER APPLY
(SELECT TOP (1) ASH.UpdatedAt AS [Status Changed Date]
FROM AssociateStatus_HST AS ASH
WHERE ASH.AssociateId = AST.AssociateId AND AST.StatusID = ASH.StatusID AND ASH.UpdatedAt > AST.UpdatedAt AND ASH.[Status] = 3
ORDER BY ASH.UpdatedAt
) ASH'