在访问中使用sql每天获得前X个结果

时间:2009-08-17 00:35:06

标签: sql ms-access

我正在尝试每天获得前2名结果,其中“最高”结果是具有最高“MPR”的行。我的表看起来像这样:

date      symbol   MPR
8/7/2008  AA       0.98
8/7/2008  AB       0.97
8/7/2008  AC       0.96
...
8/7/2008  AZ       0.50
8/8/2008  AA       0.88
8/8/2008  AB       0.87
8/8/2008  AC       0.86
...
8/8/2008  AZ       0.40
...
many other days

我希望结果集为:

date      symbol   MPR
8/7/2008  AA       0.98
8/7/2008  AB       0.97
8/8/2008  AA       0.88
8/8/2008  AB       0.87

我尝试过使用TOP关键字,但这只给了我前2行,而我正在尝试按日期进行前2行

我正在使用Microsoft Access。我很感激任何帮助! : - )

3 个答案:

答案 0 :(得分:1)

http://www.rogersaccesslibrary.com/forum/forum_posts.asp?TID=233

检查第5页

以下是解决方案:

SELECT t1.date, t1.symbol, t1.MPR
FROM table1 t1
WHERE t1.MPR IN
(
  SELECT TOP 2 t2.MPR FROM table1 t2
  WHERE
  t2.date = t1.date
  ORDER BY t2.MPR DESC
)

答案 1 :(得分:1)

你走了:

    SELECT YourTable.DateStamp, YourTable.Symbol, Max(YourTable.MPR) AS MaxOfMBR
    FROM YourTable
    GROUP BY YourTable.DateStamp, YourTable.Symbol, YourTable.MPR
    HAVING YourTable.MPR In (SELECT TOP 2 MPR FROM YourTable T2 WHERE 
    YourTable.DateStamp = T2.DateStamp ORDER BY MPR DESC)
    ORDER BY YourTable.DateStamp, YourTable.MPR DESC;

这里的技巧是使用聚合查询,然后在HAVING语句(基本上是聚合查询的“WHERE”)中,使用子查询从MPR列中提取前2个值。

我在Access 2007中创建了一个快速数据库,这很好。

编辑:这里澄清了MAX的用法。您将返回组的MAX,而不是特定日期的列的MAX值。因此,您可以获得每个日期的正确记录数(2)。

答案 2 :(得分:0)

像...这样的东西。

     SELECT DISTINCT(symbol), date, MAX(MPR) 
     FROM [TABLE]
     GROUP BY date,symbol

应该这样做......或符号,在GROUP BY中切换日期。