【问题标题】:Max date in SQL Server consultationSQL Server 咨询中的最大日期
【发布时间】:2017-12-11 19:03:48
【问题描述】:

我需要通过ItemKey 获取最大日期的行。

我需要整行。

我有这张桌子:

num | ItemKey | Serial | Qty | ItemName | Tdate
----+---------+--------+-----+----------+-------------------------
1   | 111     | 5      | 10  | AAA      | 2010-03-25 00:00:00.000 
2   | 111     | 0      | 12  | AAA      | 2010-03-26 00:00:00.000 
3   | 222     | 6      | 13  | BBB      | 2010-03-25 00:00:00.000 
4   | 222     | 2      | 11  | BBB      | 2010-03-28 00:00:00.000 
5   | 333     | 3      | 15  | CCC      | 2010-03-25 00:00:00.000 
6   | 333     | 4      | 16  | CCC      | 2010-03-26 00:00:00.000 
7   | 333     | 0      | 17  | CCC      | 2010-03-27 00:00:00.000 

我需要得到这个:

num | ItemKey | Serial | Qty | ItemName | Tdate
----+---------+--------+-----+----------+--------------------------
2   | 111     | 0      | 12  | AAA      | 2010-03-26 00:00:00.000 
4   | 222     | 2      | 11  | BBB      | 2010-03-28 00:00:00.000
7   | 333     | 0      | 17  | CCC      | 2010-03-27 00:00:00.000

我试过这条 SQL 语句:

select * 
from MyTBL 
where Tdate = (select MAX(Tdate) from MyTBL)

但不幸的是它不起作用

谢谢

【问题讨论】:

  • 如果有多个MAX(Date)记录怎么办?它应该返回一个数据集还是需要进一步的选择要求。

标签: sql sql-server tsql transactions


【解决方案1】:

你可以使用ROW_NUMBER来实现这个

SELECT * FROM (
select *,
       ROW_NUMBER() OVER (PARTITION BY ItemKey  ORDER BY Tdate DESC) as rn from MyTBL) AS T1
WHERE rn = 1

或以另一种方式(使用公用表表达式)

WITH CTE_1 AS (
    select *,ROW_NUMBER() OVER (PARTITION BY ItemKey  ORDER BY Tdate DESC) as rn from MyTBL)
SELECT * FROM CTE_1 WHERE rn = 1

【讨论】:

  • 为什么是ItemName 而不是ItemKey
  • @Sami 这是一个错误:)
  • 确定是哈迪 ;)
  • 可能值得注意的是,如果有ItemKeys 有多个具有相同MAX(Tdate) 的记录,这只会在“随机”处选择一个记录
【解决方案2】:

就这样试试吧;

   select * from MyTBL M1 inner join
    (select ItemName,max(Tdate) as Tdate from MyTBL group by ItemName) M2
    ON M1.ItemName = M2.ItemName and  M1.Tdate = M2.Tdate

【讨论】:

    【解决方案3】:

    SQL HERE

    你可以用这个:

    select t1.* from table_name t1
    join (select ItemKey, max(Tdate) Tdate from table_name group by ItemKey) as t2 
          on t1.ItemKey=t2.ItemKey and t1.Tdate=t2.Tdate
    order by t1.ItemKey
    

    【讨论】:

      【解决方案4】:

      试试这个

      WITH t AS ( SELECT *, RANK() OVER (PARTITION BY ItemName ORDER BY TDate DESC ) as myRank from MyTBL) SELECT [num], [ItemKey], [Serial], [Qty], [ItemName], [TDate] FROM t WHERE t.myRank = 1

      SQL fiddle

      【讨论】:

        猜你喜欢
        • 2013-01-16
        • 1970-01-01
        • 1970-01-01
        • 2016-01-16
        • 1970-01-01
        • 1970-01-01
        • 2015-10-12
        • 1970-01-01
        • 2015-02-22
        相关资源
        最近更新 更多