|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
Здравствуйте, товарищи! Есть таблица karts_history. В ней колонки: kart_id(integer), karts_sost(integer), karts_date(date). У одного kart_id может быть несколько karts_sost и karts_date. Как выбрать kart_id, karts_sost, karts_date, чтобы при самой поздней karts_date karts_sost='2'? Запрос SELECT kart_id, karts_sost, MAX(karts_date) FROM karts_history WHERE karts_sost='2' GROUP BY kart_id возвращает не то, что мне нужно. Заранее спасибо:) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2010, 11:35 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
Приведи скрипт создающий таблицу и заполняющий эту таблицу тестовыми данными. Покажи желаемый результат. Прочитай это: http://www.sql.ru/faq/faq_topic.aspx?fid=202 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2010, 17:35 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
White Owl, вот скрипт: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
хочу получить: Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2010, 23:04 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
А почему только эти две строки? По какому принципу ты убрал из результата строки для kart_id 101 и 102? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 00:30 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
White OwlА почему только эти две строки? По какому принципу ты убрал из результата строки для kart_id 101 и 102? Потому что при самой поздней karts_date karts_sost='2' . Т.е. у kart_id='100' и kart_id='103' есть самая поздняя дата. У этих kart_id при этой самой поздней дате karts_sost='2' . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 09:29 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
DimkostavWhite OwlА почему только эти две строки? По какому принципу ты убрал из результата строки для kart_id 101 и 102? Потому что при самой поздней karts_date karts_sost='2' . Т.е. у kart_id='100' и kart_id='103' есть самая поздняя дата. У этих kart_id при этой самой поздней дате karts_sost='2' . А у kart_id='101' и kart_id='102' при самой поздней karts_date karts_sost не равен '2'. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 10:01 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 17:36 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
White Owl, большое спасибо. Это мне очень помогло:) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 18:16 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
White Owl Код: plaintext 1. 2. 3. 4. 5.
Стараюсь в подобные темы не заглядывать, но у вас почему-то явная склонность делать лишние сканирования таблиц: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Прошлый раз я об этом упоминал, приводя эксплайн результата, полученного с помощью моей функции distincton(), правда, забыл сказать, что такой же результат можно получить с помощью group by (хотя потребление памяти на действительно больших выборках, типа многогигабайтных журналов веб-серверов, может с group by оказаться существенно выше; впрочем, мой способ оптимизации предназначен для ручных разовых выборок и тестирования, а не для продакшен-приложений). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 18:23 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
MBGСтараюсь в подобные темы не заглядывать, но у вас почему-то явная склонность делать лишние сканирования таблиц:У меня склонность делать запросы максимально простые для чтения человеком. Оптимизацию я предпочитаю отдавать оптимизатору. К тому-же, для ликвидации двойного сканирования в моем запросе достаточно сделать индекс на kart_id. MBG Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 18:45 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
White OwlMBGСтараюсь в подобные темы не заглядывать, но у вас почему-то явная склонность делать лишние сканирования таблиц:У меня склонность делать запросы максимально простые для чтения человеком. Оптимизацию я предпочитаю отдавать оптимизатору. К тому-же, для ликвидации двойного сканирования в моем запросе достаточно сделать индекс на kart_id.Ой, соврал... Не достаточно. Все равно два сканирования. Впрочем индексы все равно не помешают. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 18:50 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
White OwlУ меня склонность делать запросы максимально простые для чтения человеком. Оптимизацию я предпочитаю отдавать оптимизатору. Group by - совершенно другой тип обработки данных, и здесь явно тот случай, когда именно он нужен. Причем тут оптимизация? White OwlА здесь, простите, нарушение стандарта. Если есть group by, то в списке возвращаемых полей можно указывать только поля по которым идет группировка и агрегаты. Аналогичную выборку можно сделать и по стандарту, с помощью конструкции distinct on и соответствующей сортировки. Но, т.к. эта конструкция в эскулайт отсутствует, я назвал sqlite-specific решение, притом более гибкое. Что же касается стандарта как такового, то все СУБД имеют свои особенности реализации и я не думаю, что в форуме по СУБД SQLite стоит ломать копья из-за этого. P.S. Ничего не имею против вас лично и не стоит обижаться на подсказку, сделанную во вполне корректной форме. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 19:57 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
MBGWhite OwlУ меня склонность делать запросы максимально простые для чтения человеком. Оптимизацию я предпочитаю отдавать оптимизатору. Group by - совершенно другой тип обработки данных, и здесь явно тот случай, когда именно он нужен. Причем тут оптимизация?Оптимизация при том, что у меня нет "явной склонности делать лишние сканирования таблиц". Как я уже сказал, я пишу запрос в форме удобной для меня, а не для сервера. Если этот запрос тормозит, тогда я начинаю думать как его оптимизировать. Но обычно мне хватает оптимизатора встроенного в сервер. И до тех пор пока я пишу максимально простыми запросами я могу быть уверен что в следующей версии сервера мои "оптимизированные" запросы не встанут серверу поперек горла. Плюс - смотри следующий коментарий... MBG.... я назвал sqlite-specific решение, притом более гибкое. Что же касается стандарта как такового, то все СУБД имеют свои особенности реализации .Да, конечно. Просто тут уже играет роль то, что для меня SQLite стоит на четвертом-пятом месте. Я ее только в своих личных проектах использую. А на работе я сижу с зоопарком СУБД (практически все коммерческие базы в той или иной степени приходится обслуживать). Мне проще изворачиваться не выходя из стандарта. Особенности реализации я на зубок знаю только у SA и ASE, с остальными приходится в документацию лазить. MBGP.S. Ничего не имею против вас лично и не стоит обижаться на подсказку, сделанную во вполне корректной форме.А я разве обижался? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 21:15 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
White OwlОптимизация при том, что у меня нет "явной склонности делать лишние сканирования таблиц". Как я уже сказал, я пишу запрос в форме удобной для меня, а не для сервера. Если этот запрос тормозит, тогда я начинаю думать как его оптимизировать. Но обычно мне хватает оптимизатора встроенного в сервер. И до тех пор пока я пишу максимально простыми запросами я могу быть уверен что в следующей версии сервера мои "оптимизированные" запросы не встанут серверу поперек горла. Имхо запрос с group by намного проще связанного подзапроса. И в данном случае как раз в тему, т.к. нужна дополнительная обработка групп в выборке, для чего group by и предназначен. Т.к. не помню ни одного вашего ответа с использованием group by, то и решил напомнить о такой возможности. White Owl ... для меня SQLite стоит на четвертом-пятом месте. Я ее только в своих личных проектах использую. А на работе я сижу с зоопарком СУБД (практически все коммерческие базы в той или иной степени приходится обслуживать). Ясно. У меня как раз бизнес-решения на эскулайте, притом сейчас стараюсь оставшиеся на постгресе проекты также перенести на эскулайт. Вот не очень давно биллинг на оракле заменили биллингом на эскулайт с профитом для заказчика. Впрочем, в рунете об этом говорить не имеет смысла, а вот в sqlite-users бывают интересные дискуссии на тему использования эскулайт в крупных проектах. White OwlА я разве обижался? Мне показалось, что предложенный мной вариант был воспринят как критика. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 21:40 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
MBGВпрочем, в рунете об этом говорить не имеет смысла, а вот в sqlite-users бывают интересные дискуссии на тему использования эскулайт в крупных проектах. А почему бы и не в рунете? Если для нас родным языком является русский, то трепаться проще на русском, а значит в рунете :) А из английских я просматриваю одним глазом только comp.db.sqlite.general. А насчет крупных проектов... Сложно это переходить с проверенного годами комерческого продукта, на новый, пусть и в тысячу раз лучший, но все же новый продукт. Это ж потребует и новых людей или переобучение старых, и переписывание сотен клиентов... Мы вот с ASE 12.5 на ASE 15 переходим уже скоро год. А это всего-лишь новая версия старого продукта. Переносить бизнес-процесс на базу другого типа? Смеетесь, да? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 22:02 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
White OwlА почему бы и не в рунете? Если для нас родным языком является русский, то трепаться проще на русском, а значит в рунете :) А из английских я просматриваю одним глазом только comp.db.sqlite.general. А насчет крупных проектов... ... Переносить бизнес-процесс на базу другого типа? Смеетесь, да? Вот потому и не в рунете. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 22:14 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
MBGWhite OwlА насчет крупных проектов... ... Переносить бизнес-процесс на базу другого типа? Смеетесь, да?Вот потому и не в рунете.А в каком 'нете' запросто переходят с одной базы данных на другую? От страны это не зависит, только от размера компании. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 22:50 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
White OwlА в каком 'нете' запросто переходят с одной базы данных на другую? От страны это не зависит, только от размера компании. Это в основном зависит от того, что только в России компании могут себе позволить нелицензионное ПО, отсюда и появляется две-три версии оракла, микрософтэскуэль и проч. в пределах одной компании. Отсюда же отсутствие спроса на СУБД с открытым кодом, что легко проверить, посмотрев вакансии DBA и разработчиков. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 23:35 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
MBGЭто в основном зависит от того, что только в России компании могут себе позволить нелицензионное ПО, отсюда и появляется две-три версии оракла, микрософтэскуэль и проч. в пределах одной компании. Отсюда же отсутствие спроса на СУБД с открытым кодом, что легко проверить, посмотрев вакансии DBA и разработчиков.Ну вот уж неправда! Нелицензионное ПО здесь совершенно ни при чем. Все зависит от размера компании и жесткости централизованного руководства. У нас например семнадцать официально независимых подразделений. Каждое из которых имеет свой собственный IT отдел. Со своими собственными system & data architectures. Отсюда и зоопарк СУБД... Причем все копии совершенно лицензионные :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2010, 17:16 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
White OwlНу вот уж неправда! Нелицензионное ПО здесь совершенно ни при чем. Все зависит от размера компании и жесткости централизованного руководства. У нас например семнадцать официально независимых подразделений. Каждое из которых имеет свой собственный IT отдел. Со своими собственными system & data architectures. Отсюда и зоопарк СУБД... Причем все копии совершенно лицензионные :) Да, есть в России несколько компаний большого размера и с кучей подразделений - газпром, к примеру, или большая тройка сотовых операторов. Но зоопарк СУБД зачастую наблюдается и в гораздо меньших фирмах, где сотрудников примерно столько же, сколько у вас подразделений :-) Согласитесь, последним бывает затруднительно иметь даже единственную лицензионную копию oracle или mssql, особенно enterprize-версий (sic!) ;-) Но мы отклонились от тему - в обсуждаемом запросе все же лучше сделать group by, а не менять эскулайт на оракл ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2010, 18:02 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
2 White Owl: А возможно ли уточнить этот запрос White Owl Код: plaintext 1. 2. 3. 4. 5.
так, чтобы он правильно обрабатывал значение NULL в [karts_date] для случая, когда первая запись для каждого [kart_id] не содержит даты? Напр.: скрипт создания таблицы Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Кроме того, что хотел получить Dimkostav ([kart_id], для которых последнее (текущее) [kart_sost]=2), Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
хотелось бы отдельно получить список значений последнего по дате (или единственного, первого - с [karts_date]=NULL) [kart_sost] для каждого [kart_id]: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Я так понимаю, что max(karts_date) не возвращает строки с NULL - требует в [karts_date] хотя бы пустой строки. Не то, чтобы было невозможно везде по таблице произвести такие замены (NULL -> '' или '1900-01-01'), но, можно ли обойтись без этого? Спасибо, ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2011, 23:46 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
KolyvproКроме того, что хотел получить Dimkostav ([kart_id], для которых последнее (текущее) [kart_sost]=2), Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
[quot Kolyvpro]хотелось бы отдельно получить список значений последнего по дате (или единственного, первого - с [karts_date]=NULL) [kart_sost] для каждого [kart_id]: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
KolyvproЯ так понимаю, что max(karts_date) не возвращает строки с NULL - требует в [karts_date] хотя бы пустой строки. Не то, чтобы было невозможно везде по таблице произвести такие замены (NULL -> '' или '1900-01-01'), но, можно ли обойтись без этого?"можно", не означает "нужно". Что у вас там за таблица такая? С точки зрения физического мира эта самая karts_date может быть пустой? А она должна быть пустой? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2011, 01:19 |
|
запрос на выборку по новейшей дате
|
|||
---|---|---|---|
#18+
Спасибо. Только, по-моему, этот запрос перестает работать, если к таблице добавить запись: Код: plaintext
Второй запрос я так и не смог приспособить к своей таблице. White OwlЧто у вас там за таблица такая? С точки зрения физического мира эта самая karts_date может быть пустой? А она должна быть пустой? Таблица - с текстами правовых актов муниципального образования. Текст каждого документа разбит на части (пронумерованы [BLOCK_ID]), каждая из которых может присутствовать в нескольких редакциях: 1. начальная (в поле VRS_DATE=NULL или VRS_DATE='') 2. измененная (в ней VRS_DATE устанавилвается по дате внесения изменений) VRS_DATE (aka karts_date) при введении данных получало значение NULL или ''. Установление значения происходило только в случае внесения в соответствующую часть документа изменений (добавлялась новая строка с тем же BLOCK_ID и VRS_DATE с датой вступления изменения в силу), при этом block_id брался от прежней версии. Принадлежность части к документу устанавливается в поле [DOC_ID] Порядок частей в документе устанавливается в [ORD] Есть еще поле [BLOCK_UID] - типа autoinc(?) Вот пример таблицы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Проблема возникает при попытке получить все части одного документа (напр., с doc_id=100) на позднейшую (или любую другую дату): не могу добиться, чтобы строки с (VRS_DATE ISNULL) or (VRS_DATE='') не выводились, если есть строка с тем же BLOCK_ID и с какой-нибудь датой. запрос (по мотивам №1): Код: plaintext 1. 2. 3. 4. 5. 6. 7.
По запросу (по мотивам №2 ) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Я думал, что это решаемо с помощью Код: plaintext
После выполнения команды Код: plaintext 1. 2. 3. 4. 5.
строка с [block_uid]= 102 не выдается?! По-моему, я туплю. Надо перечитывать книжки? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2011, 17:30 |
|
|
start [/forum/topic.php?fid=54&msg=36536394&tid=2009245]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 143ms |
0 / 0 |