SELECT, чтобы получить две записи из одной таблицы, дифференцированные по дате, в одной строке - PullRequest
3 голосов
/ 31 октября 2010

У меня есть таблица, в которой я веду различные счетчики (счетчик воды, счетчик электроэнергии), а в другой таблице я храню показания для каждого счетчика.Структура таблицы выглядит следующим образом: Таблица счетчиков

MeterID | MeterType | MeterName

Таблица показаний:

ReadingID | MeterID | Index | DateOfReading

Показания счетчика считываются ежемесячно.То, что я сейчас пытаюсь сделать, - это собрать информацию об измерителе, текущее значение и предыдущее значение в одну строку.Поэтому, если бы у меня был запрос, получилась бы следующая строка:

MeterID | MeterType | MeterName | CurrnetIndex | LastIndex

Пока у меня следующий запрос:

SELECT Meter.MeterID, Meter.MeterType, Meter.MeterName, CurrentReading.Index, PreviousReading.Index
FROM Meters AS Meter
LEFT OUTER JOIN Readings AS CurrentReading ON Meter.MeterID = CurrentReading.MeterID
LEFT OUTER JOIN Readings AS PreviousReading ON Meter.MeterID = PreviouseReading.MeterID
WHERE CurrentReading.ReadingID != PreviousReading.ReadingID AND DIMESTAMPDIFF(MONTH, CurrentReading.DateOfReading, PreviousReding.DateOfReading)=-1

Проблема в том, что у меня может не быть текущегочтение или предыдущий, или оба, но мне все еще нужно было бы получить информацию о счетчике.Для меня вполне приемлемо получить пустые столбцы, но мне все еще нужна строка:)

Ответы [ 3 ]

2 голосов
/ 31 октября 2010

Использование:

   SELECT m.meterid,
          m.metertype,
          m.metername,
          current.index,
          previous.index
     FROM METER m
LEFT JOIN READING current ON current.meterid = m.meterid
                         AND MONTH(current.dateofreading) = MONTH(NOW())
LEFT JOIN READING previous ON previous.meterid = m.meterid
                          AND MONTH(current.dateofreading) = MONTH(NOW())-1

Будучи ВНЕШНИМ СОЕДИНЕНИЕМ - если фильтрация MONTH выполняется в предложении WHERE, результаты могут отличаться от результатов, полученных в предложении ON.

1 голос
/ 31 октября 2010

Вы можете использовать подзапрос, чтобы получить значение за месяц назад:

select  *
,       (
        select  Index
        from    Readings r2
        where   r2.MeterID = m.MeterID
                and DIMESTAMPDIFF(MONTH, r1.DateOfReading, 
                                  r2.DateOfReading) = -1
        ) as LastIndex
from    Meter m
left join
        Readings r1
on      r1.MeterID = m.MeterID

Другое решение состоит в том, чтобы позволить второму левому соединению завершиться неудачей. Вы можете сделать это, просто изменив условие where на:

WHERE  PreviousReading.ReadingID is null
       or 
       (
           CurrentReading.ReadingID != PreviousReading.ReadingID 
           and 
           DIMESTAMPDIFF(MONTH, CurrentReading.DateOfReading,
                         PreviousReding.DateOfReading) = -1
       )
0 голосов
/ 31 октября 2010

Ну, философия sql - хранить то, что вы знаете.если вы этого не знаете, то для этого нет никаких строк.если вы сделаете фильтр для набора записей, который вы ищете, и ничего не найдете, то для него не будет чтения ни одного месяца.Или что я не понял вопроса

...