首页 > 解决方案 > 使用 T-SQL 从 SQL Server 获取最旧的记录

问题描述

我有一个 T-SQL 查询,我需要在其中找到最旧的日期记录。我是这样写的:

SELECT
    T0.ItemCode, T0.OpenQty AS 'Qty', MIN(T1.DocDate) AS 'DocDate', 
    T1.DocNum, T1.CardCode, T1.SlpCode AS 'Sales Person', T0.WhsCode
FROM
    RDR1 T0
INNER JOIN
    ORDR T1 ON T0.DocEntry = T1.DocEntry
WHERE 
    T0.linestatus = 'O'
GROUP BY 
    T0.ItemCode, T0.OpenQty , T1.DocNum, T1.CardCode, T1.SlpCode , T0.WhsCode

但它没有返回最旧的日期记录。

数据显示在此屏幕截图中:

在此处输入图像描述

标签: sqlsql-servertsqldategreatest-n-per-group

解决方案


您可以使用在内部查询中ROW_NUMBER()通过升序对记录进行排名T1.DocDate,然后在外部查询中选择最旧的:

Select *
From (
    Select  
        T0.ItemCode, 
        T0.OpenQty as 'Qty', 
        T1.DocDate,
        T1.DocNum, 
        T1.CardCode, 
        T1.SlpCode as 'Sales Person', 
        T0.WhsCode,
        Row_Number() Over(Order By T1.DocDate) rn
    From RDR1 T0
    Inner Join ORDR T1 on T0.DocEntry = T1.DocEntry
    Where T0.linestatus = 'O'
) x
Where rn = 1

这将为您提供表中最旧的记录。如果您需要获取每个组中最旧的记录,那么您可以PARTITION BY在函数中添加一个子句ROW_NUMBER()

注意:这也假设它T1.DocDate是类似日期的数据类型,通过查看您的示例数据,这似乎是(并且应该是)这种情况。


推荐阅读