Выбор последних значений данных с отсутствующими записями

0

... где "отсутствующие записи" идентичны последнему записанному значению, следовательно, нет записи.

Это может быть субъективно, но я надеюсь, что это стандартизованный способ сделать это.

Итак, скажем, у меня есть куча аналитики в таблице MySQL. Существует некоторая недостающая информация, но, как упоминалось выше, это потому, что их предыдущее значение совпадает с текущим значением.

table "table":

id    value      datetime
1     5          1285891200    // Today
1     4          1285804800    // Yesterday
2     18         1285804800    // Yesterday
2     16         1285771094    // The day before yesterday

Как вы можете видеть, у меня сегодня нет значения для id 2.

Если бы я захотел вытащить из этой таблицы "последнее значение" (то есть 1 "сегодня" и 2 "вчера", как это сделать? Я достиг этого, выполнив следующий запрос:

SELECT id, value FROM (SELECT * FROM table ORDER BY datetime DESC) as bleh GROUP BY id

Используется подзапрос, чтобы сначала заказывать данные, а затем я полагаюсь на "GROUP BY", чтобы выбрать первое значение (которое, поскольку оно упорядочено, является самым последним) из каждого идентификатора. Тем не менее, я не знаю, можно ли вставить подзапрос в самый лучший способ получить самое последнее значение.

Как вы это сделаете?

Желаемая таблица:

id    value      datetime
1     5          1285891200    // Today
2     18         1285804800    // Yesterday

Спасибо...

  • 0
    Какое значение вы хотите за вчера? 4 или 18, или оба?
  • 0
    Хороший вопрос - я обновил вопрос, чтобы включить желаемую таблицу. В этом случае я хочу самое последнее значение для каждого идентификатора.
Теги:
datetime

1 ответ

1
Лучший ответ

Надо обойтись MySQL, чтобы разрешить заказ в подзапросе. Это не разрешено стандартом SQL:)

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

select  *
from    YourTable a
where   not exists
        (
        select  *
        from    YourTable b
        where   a.id = b.id
        and     a.datetime < b.datetime
        )

Если есть дубликаты, которые вы не можете разделить в подзапросе, вы можете group by, а затем выбрать произвольное значение:

select  a.id
,       max(a.value)
,       max(a.datetime)
from    YourTable a
where   not exists
        (
        select  *
        from    YourTable b
        where   a.id = b.id
        and     a.datetime < b.datetime
        )
group by
        a.id

Это выбирает максимальный a.value общий доступ к datetime. Теперь datetime одинаково для всех повторяющихся строк, но стандартный SQL этого не знает, поэтому вам нужно указать способ выбрать из равных дней. Здесь я использую max, но min или даже avg будет работать так же хорошо.

  • 0
    Приятно! Хорошо, но мы предполагаем, что существует более одного значения для идентификатора, поэтому мы можем сравнить и получить «последний» - но это не учитывает угловой случай, когда есть только одно значение, потому что он не будет удовлетворить a.datetime < b.datetime . ;) Я работал над этим с отдельным запросом, чтобы убедиться, что всегда есть 2, а просто пища для размышлений. :)
  • 0
    @Julian H. Lam: условие позади not exists , поэтому, если оно не выполнено, оно будет включено в набор результатов. Я ожидаю, что запрос будет работать, если будет только одно значение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню