我有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.
答案 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)
答案 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小提琴和上面的查询。