1

给定表定义:

create table mytable (
    id integer,
    mydate datetime,
    myvalue integer )

我想通过一个 SQL 查询得到以下答案:

id date_actual value_actual date_previous value_previous

在哪里:

date_previous is the maximum of all the dates preceeding date_actual 
for each id and values correspond with the two dates 
{max(date_previous) < date_actual ?}

我怎样才能做到这一点?

感谢您的提示

4

2 回答 2

1

这是每周在 StackOverflow 上出现的常见“每组最大 N 个”查询的变体。

SELECT m1.id, m1.mydate AS date_actual, m1.myvalue AS value_actual,
  m2.mydate AS date_previous, m2.myvalue AS value_previous
FROM mytable m1 
LEFT OUTER JOIN mytable m2 
  ON (m1.id = m2.id AND m1.mydate > m2.mydate)
LEFT OUTER JOIN mytable m3 
  ON (m1.id = m3.id AND m1.mydate > m3.mydate AND m3.mydate > m2.mydate)
WHERE m3.id IS NULL;

换句话说,m2是所有行都具有相同的id和较小的mydate,但我们只想要一个这样的行,即没有m3日期介于m1和之间的行m2。假设日期是唯一的,那么只有一行m2是这样的。

于 2009-10-22T06:25:15.067 回答
0

假设我正确理解了您的要求,您可以尝试以下方法。

select a.id, 
       a.mydate as date_actual, 
       a.value as value_actual,
       b.date as date_previous, 
       b.value as value_previous
from mytable a, mytable b
where a.id = b.id and
      a.mydate > b.mydate and
      b.mydate = (select max(mydate) from mytable c where c.id = a.id and c.mydate < a.mydate)

为丑陋的 SQL 道歉。我相信有更好的方法来做到这一点。

于 2009-10-22T06:35:08.107 回答