Агрегатная функция по сравнению 2 строк в одной таблице (SQL) - PullRequest
1 голос
/ 22 октября 2009

С учетом определения таблицы:

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 ?}

Как мне этого добиться?

Спасибо за ваши подсказки

Ответы [ 2 ]

1 голос
/ 22 октября 2009

Это разновидность общего запроса «наибольшее N на группу», который появляется каждую неделю в StackOverflow.

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 будет только одна строка, где это правда.

0 голосов
/ 22 октября 2009

Если я правильно понял ваши требования, вот что вы можете попробовать.

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. Я уверен, что есть лучшие способы сделать это.

...