... где "отсутствующие записи" идентичны последнему записанному значению, следовательно, нет записи.
Это может быть субъективно, но я надеюсь, что это стандартизованный способ сделать это.
Итак, скажем, у меня есть куча аналитики в таблице 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
Спасибо...
Надо обойтись 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
будет работать так же хорошо.
a.datetime < b.datetime
. ;) Я работал над этим с отдельным запросом, чтобы убедиться, что всегда есть 2, а просто пища для размышлений. :)
not exists
, поэтому, если оно не выполнено, оно будет включено в набор результатов. Я ожидаю, что запрос будет работать, если будет только одно значение.