SQL - Как получить самую последнюю дату, которая имела какую-либо запись до определенной даты? - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть таблица t1, как показано ниже:

 -----------------------------
 |    date   |  id   | value |
 -----------------------------
 | 2/28/2019 |  1    | 55  |
 | 2/28/2019 |  2    | 44  |
 | 2/28/2019 |  3    | 33  |
 | 2/26/2019 |  1    | 22  |
 | 2/26/2019 |  2    | 12  |
 | 2/26/2019 |  3    | 11  |
 -----------------------------

Я хочу взять abc3 из t1, а затем найти значение abc3 для даты - 1 день в той же таблице t1 и отобразить обе записи.

Я создал запрос как:

select 
    a.date, a.id, (a.value - b.value) as 'difference-from-previous-day'
FROM 
    t1 a
INNER JOIN
    t1 b
ON 
    a.ID = b.ID
WHERE 
    b.DATE in (dateadd(day, -1, a.DATE));

И это прекрасно работает, когда все даты есть.

Но в датах есть пробелы (например, когда мы смотрим на данные за понедельник идо понедельника «выходные» - в таблице t1 нет данных за последний день -1, поэтому этот запрос показывает NULL для понедельника) ...

Как написать запрос для получения последней датыдо текущей даты (а НЕ -1 дата), для которой существуют данные?

Ожидаемый результат:

2/28/2019 | 1 | 33     (which is "55 - 22")
2/28/2019 | 2 | 32     (which is "44 - 12")
2/28/2019 | 3 | 22     (which is "33 - 11")

Спасибо.

Ответы [ 3 ]

0 голосов
/ 29 апреля 2019

Вы, кажется, хотите:

select t1.*
from t1
where t1.value = 'abc'
order by t1.date desc
limit 2;
0 голосов
/ 29 апреля 2019

Вам нужно самостоятельное объединение на столе, например:

select 
  t.date, 
  t.id,
  t.value - tt.value diff
from t1 t inner join t1 tt
on tt.id = t.id
and tt.date = (select max(date) from t1 where date < t.date)

Возможно, inner join можно изменить на left join, чтобы охватить случай, когда для каждого * нет предыдущей строки id.Смотрите демо .Результаты:

| date                | id  | diff |
| ------------------- | --- | ---- |
| 2019-02-28 00:00:00 | 1   | 33   |
| 2019-02-28 00:00:00 | 2   | 32   |
| 2019-02-28 00:00:00 | 3   | 22   |
0 голосов
/ 29 апреля 2019

Вы можете использовать коррелированный запрос:

SELECT t.*, t.value - (
    -- this one selects newest row older than outer row
    SELECT value
    FROM t AS x
    WHERE x.id = t.id
    AND x.date < t.date
    ORDER BY x.date DESC
    LIMIT 1
) AS diff
FROM t
WHERE NOT EXISTS (
    -- this part filters all but the most recent row
    SELECT 1
    FROM t AS x
    WHERE x.id = t.id
    AND x.date > t.date
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...