【问题标题】:TSQL Query to fetch row details of a table having the maximum value for a columnTSQL查询以获取具有列最大值的表的行详细信息
【发布时间】:2011-01-03 18:21:37
【问题描述】:

我有两张桌子。

表一

Num 
1
2
3

表 2

Num   Date    Amount
1     12/31     30
1     12/30     31
1     12/29     20
2     12/31     100
2     12/30     90
3     12/31     12
4     11/1       1

现在我的结果应该有

   Num   Date    Amount
    1    12/31     30
    2    12/31     100 
    3    12/31     12

(对于表 1 中的 'Num' 值,与日期最近的 table2 连接)

我正在尝试编写一个 tsql 查询来实现这一点。

感谢任何帮助。谢谢

【问题讨论】:

  • 如果表 2 的第一行不存在,您的结果会怎样?
  • 换句话说,您是在寻找 date =(表中最近的)的行,还是 date=(该 num 的最近)的行?
  • @Blorgbeard 我正在寻找 table2 中的行,其中 date = 该数字的最新日期。

标签: sql tsql


【解决方案1】:

如果您想要每个 table1 num 单独的最近日期:

with maxdates as (
    select  T1.num, max(T2.date) as date
      from  table2 T2
      join  table1 T1
        on  T2.num = t1.num
    group by T1.num
)
select  t2.num, t2.date, t2.amount
  from  table2 T2
  join  maxdates M
    on  T2.num = M.num
    and T2.date = M.date

或者如果您想要表中所有匹配记录的最近日期:

with maxdate as (
    select  max(T2.date) as date
      from  table2 T2
      join  table1 T1
        on  T2.num = t1.num
)
select  t2.num, t2.date, t2.amount
  from  table2 T2
  join  table1 T1
    on  T2.num = T1.num
  join  maxdate M
    on  T2.date = M.date

【讨论】:

    【解决方案2】:

    试试这个查询:

    SELECT b.*
      FROM  Table1 a INNER JOIN
                    (
            SELECT a.*, 
                   ROW_NUMBER() OVER(PARTITION BY a.Num ORDER BY Date DESC) rnk
              FROM Table2  a
            ) b
            ON a.Num = b.Num
            AND rnk = 1
    

    【讨论】:

      【解决方案3】:

      试试这个

      select t2.* from table2 as t2 inner join table1 as t1 on t2.num=t2.num
      inner join
      (
      Select t2.num,max(t2.amount) as amount from table2 
      group by  t2.num
      ) as t3 on t2.amount=t3.amount
      

      【讨论】:

        【解决方案4】:
        DECLARE @t1 TABLE(num INT)
        DECLARE @t2 TABLE(num INT, [date] NVARCHAR(5), amount INT)
        
        INSERT INTO @t1 (num) VALUES (1),(2),(3)
        
        INSERT INTO @t2 (num,[date],amount) VALUES (1,'12/31',30)
        INSERT INTO @t2 (num,[date],amount) VALUES (1,'12/30',31)
        INSERT INTO @t2 (num,[date],amount) VALUES (1,'12/29',20)
        INSERT INTO @t2 (num,[date],amount) VALUES (2,'12/31',100)
        INSERT INTO @t2 (num,[date],amount) VALUES (2,'12/30',90)
        INSERT INTO @t2 (num,[date],amount) VALUES (3,'12/31',12)
        INSERT INTO @t2 (num,[date],amount) VALUES (4,'11/01',1)
        
        SELECT t2.num,t2.[date],amount 
        FROM @t1 t1 JOIN @t2 t2 ON t1.num = t2.num
        WHERE t2.[date] in (
                                SELECT MAX(t3.[date]) 
                                FROM @t2 t3 
                                WHERE t3.num = t2.num
                            )
        ORDER BY t2.num
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-09
          • 2020-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多