У меня проблема с производительностью при выборе данных в моем проекте.Tricky SQL SELECT Statement
Существует таблица с 3-мя столбцами: «Идентификатор», «время» и «группа»
- Идентификаторы просто уникальные идентификаторы, как обычно.
- Время создания записи.
- Группа должна объединить некоторые записи вместе.
Таким образом, данные таблицы могут выглядеть следующим образом:
ID | TIME | GROUP
------------------------
1 | 20090805 | A
2 | 20090804 | A
3 | 20090804 | B
4 | 20090805 | B
5 | 20090803 | A
6 | 20090802 | B
... и так далее.
Задача теперь выбрать «текущие» записи (их идентификаторы) в каждой группе на определенную дату. То есть, для каждой группы найдите самую последнюю запись для данной даты.
следующие предпосылки применяются:
- Я не знаю, различные группы заранее - может быть много различных те изменения с течением времени
- дата выбора может лежать «между» даты совершения записи в таблице. Тогда я должен найти ближайший в каждой группе. То есть TIME меньше даты выбора, но максимум тех, к которым это правило применяется в группе.
Что я в настоящее время сделать это многоэтапный процесс, который я хотел бы изменить в одном ЗЕЬЕСТА:
SELECT DISTINCT group FROM table
найти доступные группы- Для каждой группы найдено в 1),
SELECT * FROM table WHERE time<selectionDate AND group=loop ORDER BY time DESC
- Возьмет первую строку каждого результата найденной в 2)
Очевидно, что это не является оптимальным.
Таким образом, я был бы очень рад, если бы более опытный эксперт по SQL мог помочь мне найти решение для ввода этих шагов в один оператор.
Спасибо!
Какую базу данных вы используете? Более продвинутые функции сильно различаются. – Thilo
'TIME',' TABLE' и 'GROUP' являются зарезервированными ключевыми словами SQL и, как таковые, я нахожу их немного вводящими в заблуждение в качестве имен объектов SQL, таких как таблицы и столбцы. – pilcrow
Прежде всего, СПАСИБО много за быстрые и отличные ответы. Я действительно забыл некоторые детали: я работаю с ORACLE, но предпочтительно решение должно также работать с Postgresql. И да, имена действительно вводят в заблуждение ключевые слова - извините. –