SQL для отображения значения на разные даты - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть таблица с именем Reading_Hist, содержащая такие столбцы, как Чтение, Дата, Идентификатор. Эта таблица содержит историю чтений. Пример

+----+---------+-------------+
| ID | Reading | ReadingDate |
+----+---------+-------------+
|  1 |      12 | 9/12/2018   |
|  2 |      15 | 9/12/2018   |
|  1 |      16 | 9/5/2018    |
|  4 |       1 | 9/12/2018   |
|  3 |      65 | 9/12/2018   |
|  1 |      23 | 8/29/2018   |
|  3 |      25 | 9/5/2018    |
|  2 |      23 | 9/5/2018    |
|  4 |       3 | 9/5/2018    |
+----+---------+-------------+

Я хочу написать sql для отображения каждого идентификатора и его текущего Показания в первом столбце, следующее чтение за неделю до, а третье чтение за две недели до и последний тренд чтения.

Пример результата ниже.

+----+---------+------+------+-------+
| ID | Current | Wk_1 | Wk_2 | Trend |
+----+---------+------+------+-------+
|  1 |      12 |   16 | 23   | Down  |
|  2 |      15 |   23 | NULL | Down  |
|  3 |      65 |   25 | NULL | UP    |
|  4 |       1 |    3 | NULL | Down  |
+----+---------+------+------+-------+

1 Ответ

0 голосов
/ 13 сентября 2018

Вы можете использовать агрегацию, чтобы получить максимальный день чтения для каждого идентификатора.Затем осталось присоединиться к текущим показаниям, их за последнюю неделю и две недели назад.Используйте CASE для расчета тренда.

Это может выглядеть примерно так:

SELECT x.id,
       rh2.reading current,
       rh3.reading wk_1,
       rh4.reading wk_2,
       CASE
         WHEN rh2.reading > rh3.reading THEN
           'Up'
         WHEN rh2.reading < rh3.reading THEN
           'Down'
         WHEN rh2.reading = rh3.reading THEN
           '-'
       END trend
       FROM (SELECT rh1.id,
                    max(rh1.reading_date) reading_date
                    FROM reading_hist rh1
                    GROUP BY rh1.id) x
            LEFT JOIN reading_hist rh2
                      ON rh2.id = x.id
                         AND rh2.reading_date = x.reading_date
            LEFT JOIN reading_hist rh3
                      ON rh3.id = x.id
                         AND rh3.reading_date = dateadd(day, -7, x.reading_date)
            LEFT JOIN reading_hist rh4
                      ON rh4.id = x.id
                         AND rh4.reading_date = dateadd(day, -14, x.reading_date);

Конечно, это требует, чтобы показания были ровно через 7 или 14 дней с последнего дня чтений..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...