【问题标题】:SQL Server 2008 R2 Choose Certain Rows on Certain ConditionsSQL Server 2008 R2 在特定条件下选择特定行
【发布时间】:2018-09-24 16:07:00
【问题描述】:

编辑:对不起,项目不应该是 A 和 B,它们都是 A。但是,当它们具有不同的 in_date 时,它​​们被认为是不同的。所以,我已经相应地编辑了我的问题。

我有问题。见下表:

Item | In_Date | Qty_Balance | Created_At
-----+---------+-------------+---------------------------    
A    | 1       | 90          | 2018-09-26 16:09:26.523
A    | 1       | 96          | 2018-09-26 15:26:12.507
A    | 2       | 50          | 2018-09-26 15:24:43.617
A    | 2       | 45          | 2018-09-24 15:47:40.977

如您所见,该表按列“Created_At”降序排列。现在,我需要的是获取“Qty_Balance”数据,但每个项目只输入最后一个。因此,对于 A,我需要获得 90 的“Qty_Balance”,而对于 B,我需要获得 50 的“Qty_Balance”。我们可以通过参考“Created_At”列来判断最后输入的数据,这就是为什么该列按降序排列。所以,为了清楚起见,我需要的是:

Item | In_Date | Qty_Balance | Created_At
-----+---------+-------------+-------------------------    
A    | 1       | 90          | 2018-09-26 16:09:26.523
A    | 2       | 50          | 2018-09-26 15:24:43.617

我怎样才能做到这一点?请帮助我。提前谢谢你。

【问题讨论】:

    标签: sql sql-server sql-server-2008-r2


    【解决方案1】:

    你可以尝试使用ROW_NUMBERwindow functionIn_Date组成一个组,使行号order by Created_At DESC,然后得到行号为1行。

    Select 
        Item , 
        In_Date ,
        Qty_Balance , 
        Created_At
    from (
        SELECT *,ROW_NUMBER() OVER(PARTITION BY In_Date ORDER BY Created_At DESC) rn
        FROM T
    )t1 
    where rn = 1
    

    SQLFIDDLE

    注意

    • ROW_NUMBER函数生成行号。

    • Window function 在应用关联的窗口函数之前确定行集的分区和排序。

    【讨论】:

    • 您好,感谢您的快速回复。但是,这似乎并不能解决我的问题。我没有得到我需要的东西。
    • 我编辑你可以试试,因为你编辑你的样本数据。
    • 您好,再次感谢您的快速回复,非常感谢。这似乎解决了我的问题。但是,如果您不介意我问,“rn=1”到底是做什么的?我的意思是,为什么要使用“where rn=1”?只是好奇。再次谢谢你,真的。你让我今天一整天都感觉很好! :)
    • @RchLuvSlly 我添加更多解释希望可以帮助你。 rn 是从子查询生成的行号。
    • "rn" 是“ROW_NUMBER() OVER(PARTITION BY In_Date ORDER BY Created_At DESC)”的名称。所以基本上你得到了每个分区的第 1 行。
    猜你喜欢
    • 1970-01-01
    • 2017-01-10
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    相关资源
    最近更新 更多