SQL получает все значения за определенный промежуток времени - и тот, что до этого - PullRequest
1 голос
/ 31 марта 2019

У меня есть таблица, в которой каждый ActorId имеет Value, но Value будет меняться со временем, и мы отслеживаем все изменения этих значений.

Пример:

Id  ActorId     Value   Timestamp
--------------------------------
1   5           10      2019-01-05
2   8           8       2019-01-07
3   8           5       2019-01-08
4   5           15      2019-01-11
5   3           12      2019-01-11
6   3           7       2019-01-12
7   3           14      2019-01-14
[...]

Если мы загрузим все в память, то для каждого Actor будет довольно просто проверить, каким будет значение в любой момент времени (или оно будет нулевым / неопределенным , если оно никогда не былоустановить до даты запроса).Дело в том, что мне действительно нужно отправить все эти данные в браузер и сделать это в JavaScript.

Проблема в том, что полная таблица станет действительно очень большой.Как в уникальных ActorIds , так и в изменения значений на каждый ActorId.

Обычно мне просто требуется относительно небольшой выбор ActorId с и короткий период времени, скажемдва месяца.

Я мог бы сделать что-то вроде:

SELECT *
FROM [ActorValue]
WHERE 
    ActorId IN (5, 8, 12, [...])
    AND Timestamp >= '2019-02-01' 
    AND Timestamp <= '2019-04-01'

И отправить эти результаты в JavaScript для дальнейшей обработки.

Проблема в том, что мне также нужно значение в начале периода.Поэтому для каждого ActorId мне нужны значения в диапазоне дат и одно изменение значения до этого .

Каков наилучший способ решения этой проблемы без загрузки всех изменений значения в память.

Так что я теоретически ищу что-то вроде:

 AND Timestamp >= '2019-02-01' -- plus the entry before this date, grouped by ActorId

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Я бы просто использовал lead():

SELECT av.*
FROM (SELECT av.*, 
             LEAD(Timestamp) OVER (PARTITION BY ActorId ORDER BY Timestamp) as next_timestamp
      FROM ActorValue av
      WHERE ActorId IN (5, 8, 12, [...])
     ) av
WHERE next_Timestamp >= '2019-02-01' 
      Timestamp <= '2019-04-01';
1 голос
/ 31 марта 2019

Я думаю, что это можно решить, добавив больше условий в предложение WHERE. Либо запись принадлежит интервалу анализа, либо это самая последняя запись до начала периода анализа для соответствующего субъекта. Последнее условие может быть выражено с использованием условия NOT EXISTS и коррелированного подзапроса.

Попытка:

SELECT *
FROM [ActorValue] a
WHERE 
    ActorId IN (5, 8, 12, [...])
    AND 
    (
        (
            Timestamp >= '2019-02-01' 
            AND Timestamp <= '2019-04-01'
        )
        OR (
            Timestamp < '2019-02-01' 
            AND NOT EXISTS (
                SELECT 1 FROM [ActorValue] a1 
                WHERE 
                    a1.ActorId = a.ActorId 
                    AND a1.Timestamp < '2019-02-01' 
                    AND a1.Timestamp > a.Timestamp
            )
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...