2012-11-20 86 views
1

我有2代表作为如下─选择最大值导致

表I

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

而另一表(1H)用下面的信息 -

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显示注释字段。因此,使用上面的输出数据应为─

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 

代码然而,当我执行的代码我GET-

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

回答

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。

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

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' 
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' 
+0

嗯我得到不正确的列表达:'[选择顶部1 IH.NOTE从IH IH.ID = IID ORDER BY RECNO DESC''')。 – Andy

+0

这对我来说很好......你是否使用[SELECT]代替(SELECT) - (1,1,'Open'), (选择 - 创建表#ih(ID int,RECNO int, (1,2,'Update'), (1,3'Close'), (2,1'Open'), (2,2'Update'), (2,3' (1,'20120101'),(2,'20120101')插入#i值(1,'20120101'), (2,4'Close'); 创建表#i(ID int,[DATE] datetime) ; SELECT I.ID,I.DATE ,(选择TOP 1 IH.NOTE FROM #IH IH其中IH.ID = i.ID通过Recno中DESC顺序)注 从#i中我 d ROP表#i 删除表#ih – bummi

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

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小提琴和上面的查询。