比较内部选择查询的列

时间:2011-09-08 06:01:04

标签: sql-server-2005 tsql select

假设我从查询中获取以下表格。

2011-08-09 16:43:37.160   020102100037  74.9900
2011-08-09 16:43:37.177   020102100038  74.9900
2011-09-07 16:48:57.823   020102100037  75.9900
2011-09-07 16:48:57.823   020102100038  75.9900
2011-09-07 16:49:19.000   020102100037  80.0000
2011-09-07 16:49:19.000   020102100038  80.0000 

QUERY

SELECT productcode, price FROM ( 
    inner select statement ) AS t

现在我想获得具有最大日期的代码(第2列)。在上表中我将得到结果。

2011-08-09 16:43:37.160   020102100037  74.9900
2011-08-09 16:43:37.177   020102100038  74.9900

所以我正在尝试这个查询。

SELECT productcode, price FROM (
    SELECT productcode, price FROM ( 
        inner select statement) AS c  
    WHERE date =
        (SELECT MAX(cast(date as datetime)) 
        FROM c WHERE productcode = c.productcode  

但我收到了错误

无效的对象名称“c”。

任何机构都可以向我建议解决方案或任何其他替代方案来执行此任务。

1 个答案:

答案 0 :(得分:3)

c不是表或视图,它是派生表。你不能那样重用它。如果要重用,请查找Common Table Expressions。无论如何,GROUP BYSELECT TOP 1ROW_NUMBER出了什么问题?它们通常用于解决这些问题。

WITH cteProducts
     AS (SELECT ProductDate
                , ProductCode
                , ProductPrice
                , ROW_NUMBER() OVER (PARTITION BY ProductCode ORDER BY ProductDate DESC) RowNumber
           FROM Products)
SELECT *
  FROM cteProducts
 WHERE RowNumber = 1;