Sql для отображения значения для разных дат

У меня есть таблица с именем 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  |
+----+---------+------+------+-------+

@SoConfused, как вы узнали, что это не SQL Server / tsql?

jarlh 13.09.2018 21:27

@jarlh Я не уверен, что понимаю. Не могли бы объяснить, пожалуйста?

SoConfused 13.09.2018 21:29

какой db вы используете ??

ScaisEdge 13.09.2018 21:29

@SoConfused, при редактировании вы удалили теги <sql-server> и <tsql> ...

jarlh 13.09.2018 21:30

@jarlh, если бы я это сделал, это была 100% честная ошибка. Совершенно не хотел этого делать.

SoConfused 13.09.2018 21:31

@scaisEdge с использованием хранилища данных Azure (сервер Sql)

gopi nath 13.09.2018 21:33

В зависимости от ваших данных вы можете PIVOT на ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ReadingDate DESC), отправив соответствующий Reading в результаты.

JNevill 13.09.2018 21:36
0
7
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать агрегирование, чтобы получить максимальное количество показаний для каждого идентификатора за день. Затем оставшиеся присоединяются к текущим показаниям, сделанным за последнюю неделю и две недели назад. Используйте 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 дней с последнего дня показаний.

Отлично. Ваш код отлично работает, чтобы отобразить требуемый результат, но при вычислении тренда есть некоторые проблемы. Я пытаюсь понять это. В таблице указано ежедневное чтение за один год, поэтому есть чтение за каждый день до прошлого года. Изменить - я просто изменил знаки <>, и теперь он работает :)

gopi nath 13.09.2018 21:53

Другие вопросы по теме