从第一个表结果中的第二个表中选择最大值

时间:2012-11-20 17:08:03

标签: sql sql-server

我有2张表格如下 -

表一

ID  DATE
1   05/11/12
2   23/11/12
3   29/11/12
4   04/10/12
5   20/11/12

另一张表(IH),其中包含以下信息 -

ID  RECNO   NOTE
1   1       Open
1   2       Update
1   3       Close
2   1       Open
2   2       Update
2   3       Hold
2   4       Close
3   1       Open
4   1       Open
4   2       Update
5   1       Open

我想输出如下所示的结果,使用每个ID的最高RecNo值显示Note字段。因此,使用输出上面的数据应该是 -

ID  DATE        NOTE
2   23/11/12    Close
3   29/11/12    Open

我的代码是 -

SELECT I.ID, I.DATE, IH.NOTE FROM
I I, IH IH
JOIN (SELECT MAX([RECNO]) [RECNO] FROM
IH
GROUP BY RECNO) IH2 ON IH2.ID = IH.ID AND
IH2.[RECNO] = IH.[RECNO]
JOIN I I2 ON I2.ID = IH.ID WHERE
(I2.DATE>={TS ‘2012-11-22 00:00:002}) GROUP BY I2.ID

然而,当我执行代码时,我得到了 -

Invalid Column Name 'RECNO'. Statement(s) could not be prepared.

5 个答案:

答案 0 :(得分:1)

这个怎么样?注意,还没试过,我现在在Mac上。

SELECT I.ID, I.DATE, IH.NOTE
FROM I I
OUTER APPLY 
  (SELECT TOP 1 *
   FROM IH 
   WHERE IH.ID = I.ID
   ORDER BY RECNO DESC) IH    
WHERE I.DATE >= '2012-11-22'

答案 1 :(得分:0)

你的SQL相当,呃,凌乱。

假设您使用的是SQL Server 2005或更高版本,则可以使用row_number()函数,如下所示:

SELECT I.ID, I.DATE, IH.NOTE
FROM I join
     (select ih.*, ROW_NUMBER() over (PARTITION by id order by recno desc) as seqnum
      from IH
     ) ih
     on IH2.[RECNO] = IH.[RECNO] and seqnum = 1
WHERE I2.DATE>='2012-11-22 00:00:002'

这是在IH表中为每个具有最高记录号的id获得值“1”的序列号。其余的只是SQL。

你的原始查询在语法上是不正确的,但我认为这是你想要的基于描述。

答案 2 :(得分:0)

和另一个

SELECT I.ID, I.DATE
,(Select TOP 1 IH.NOTE FROM IH where IH.ID=i.ID Order by Recno DESC) as Note
from I
WHERE
I.DATE>'20121122'

答案 3 :(得分:0)

也许这会有所帮助

SELECT a.ID, a.DATE, b.NOTE FROM a
inner join  b on a.ID = b.ID
where b.recno in (select max(bb.recno)
               from b as bb where bb.id = b.id)

http://sqlfiddle.com/#!3/fd141/2

答案 4 :(得分:0)

如果您不介意不同的标识符,请查看此解决方案:

select t1.MyID, t1.MyDate, y.Note
from t1
join
(
    select MyID, max(RecNo) as RecNo
    from t2
group by MyID
) x
    on t1.MyID = x.MyID
left join
(
    select *
    from t2
) y
    on t1.MyID = y.MyID
and x.RecNo = y.RecNo
where t1.MyDate >= '2012.11.22'

完整的解决方案在这里:http://sqlfiddle.com/#!3/4ca09/3

更新:哎呀,忘了在where子句中引入日期。更新了SQL小提琴和上面的查询。