查询访问最新日期记录。

4

我的表格

id  home  datetime     player   resource
---|-----|------------|--------|---------
1  | 10  | 04/03/2009 | john   | 399 
2  | 11  | 04/03/2009 | juliet | 244
5  | 12  | 04/03/2009 | borat  | 555
3  | 10  | 03/03/2009 | john   | 300
4  | 11  | 03/03/2009 | juliet | 200
6  | 12  | 03/03/2009 | borat  | 500
7  | 13  | 24/12/2008 | borat  | 600
8  | 13  | 01/01/2009 | borat  | 700

结果将选择最新的两个日期之间的所有记录,如何编写查询?

2
你使用哪个关系型数据库管理系统? - Giorgos Betsos
使用标签dbms!(无论是MySQL还是MS SQL Server在处理日期/时间时都不符合ANSI SQL标准...) - jarlh
1个回答

4
你可以使用 DENSE_RANK 来完成这个任务:
SELECT id, home, [datetime], player, resource
FROM (
  SELECT id, home, [datetime], player, resource,
         DENSE_RANK() OVER (ORDER BY [datetime] DESC) AS rnk
  FROM mytable) AS t
WHERE t.rnk <= 2

DENSE_RANK函数将值1分配给所有与最新日期值相关的记录,将值2分配给所有与次新日期值相关的记录。

输出:

id  home    datetime            player  resource
=================================================
7   13  2009-12-12 02:00:00.000 borat   600
1   10  2009-04-03 03:00:00.000 john    399
2   11  2009-04-03 03:00:00.000 juliet  244
5   12  2009-04-03 03:00:00.000 borat   555

在MySQL中,你可以使用变量来模拟DENSE_RANK
SELECT id, `datetime`, player, resource
FROM (
  SELECT id, `datetime`, player, resource,
         @rn := IF(@dt = `datetime`, @rn, 
                   IF(@dt := `datetime`, @rn + 1, @rn + 1)) AS rnk
  FROM mytable
  CROSS JOIN (SELECT @rn := 0, @dt := '1900-01-01') AS vars
  ORDER BY `datetime` DESC) AS t
WHERE t.rnk <= 2

Demo here


@EdwinBaby 不,MySQL中没有窗口函数。 - Giorgos Betsos
请问您能告诉我如何在MySQL中实现相同的功能吗? - Edwin Baby
row_number() 在每个分区中只能生成一个值为1的行号。而rank()或dense_rank()可以在每个分区中生成多个相同值的实例。 - Paul Maxwell
@Edwin Baby:你说你正在使用SQL Server,所以你应该使用DENSE_RANK解决方案。你需要MySQL解决方案吗? - Thorsten Kettner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接