|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
Ура, впервые удалось спросить что-то по работе! Посоветуйте, пожалуйста, как лучше построить запрос, который не только группирует строки, но также для каждой группы находит актуальную (самую недавнюю). Пример: история цен для разных товаров. Товар определяется двумя колонками (продукт, цвет). В некоторые дни цены обновляются, делая предыдущие неактуальными. Цены не более одного раза в день обновляются. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Нужно вывести прейскурант на сегодня, т.е. показать все товары, и сопутствующие элементы строки: 1, 2.49, 'Apple', 'Red' 1, 5.99, 'Pear', 'Small' 3, 3.69, 'Apple', 'Green' Столько разных способов, не могу выбрать оптимальный. Кроме цены в строке полно столбцов, не хочется повторять аналитическую функцию для каждого. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Второй вроде ничего, учитывая что селф-джойн идет по primary key (day,prod.clr), но наверное кто-то знает еще лучше способ, ведь проблема сгруппировать, а потом выбрать лидера ис каждой группы наверное часто встречается. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 18:31 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 18:47 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
Щукина Анна, кому баян, кому образование. Спасибо за ссылку! Сижу, сравниваю со своими шедеврами. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 18:52 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
Щукина Анна Баян может заиграть новыми мелодиями. Например match_recognize. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 18:56 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
Добавь поле ACTIVE и используй SCD2. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 18:58 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
Еще раз скажу - отличный баян! Я там даже нашел понравившийся мне пример. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
отсюда: 1357243 Но... не работает. Нельзя rowid использовать ни с distinct, ни с group by. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 19:33 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
НеофитSQL Я там даже нашел понравившийся мне пример. Но... не работает. Нельзя rowid использовать ни с distinct, ни с group by. Работать то он работает: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Но искать смысловую нагрузку min(rowid) - типа самая ранняя строка это . SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 20:03 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
в 99% случаев делаю через row_number Код: plsql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 20:08 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
SY, лол, нет конечно не min(rowid). MAX (rowid)! С инлайн вью конечно мне не стоило пытаться использовать rowid, d'oh! Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Собственно, то что я хотел с самого начала, но не получалось написать - забыл что у inline view не бывает rowid. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 20:17 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
andreymx, Тут просто коллекция решений растет. Вот бы кто-то FAQ написал на эту тему.. А есть способ потом крайнюю колонку как-нибудь спрятать или соскрести, не перечисляя все столбцы? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 20:21 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
НеофитSQL А есть способ потом крайнюю колонку как-нибудь спрятать или соскрести, не перечисляя все столбцы? Если версия сервера позволяет, то почему бы и нет? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Проверка на fiddle ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 20:34 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
НеофитSQL лол, нет конечно не min(rowid). MAX (rowid)! Ты так ничего и не понял и как обычно в своем амплуа - кому нужны концепции. Ну нет корреляции между ROWID и временем вставки. MIN(ROWID) и MAX(ROWID) это ни первый ни последний. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 20:35 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
SY, Вообще-то я рассчитывал что клюнет env, но он видать спит. Min/max в этом контексте работает одинаково, и от значений rowid не зависит, они в каждой группе одинаковые. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 21:28 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
НеофитSQL одинаковая долгая писанина Это sql, смирись. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 04:48 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
НеофитSQL, Тебе его не победить. Он хорош, пока задача не вываливается далеко за рамки реляционной алгебры. Всё закончится тем, что ты свалишь писать генераторы sql-лапши на каком-нибудь яп общего назначения. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 06:27 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
НеофитSQL Вообще-то я рассчитывал что клюнет env Клюнет на что? На бред с min/max по rowid, который зависит от фазы Луны, положения Венеры в Тельце, enable row movement и прочих телодвижений с блоками? НеофитSQL они в каждой группе одинаковые Концепции прочтите вы уже... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 09:14 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
НеофитSQL Но... не работает. Нельзя rowid использовать ни с distinct, ни с group by. по одному наймолодшему в отделе Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 10:41 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
Stax НеофитSQL Но... не работает. Нельзя rowid использовать ни с distinct, ни с group by. по одному наймолодшему в отделе Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 11:00 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
andreymx через опу можно сделать многое... но стОит ли? в древних версиях стоило, счас наверное нет я б делал через row_number ...... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 11:07 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
Stax НеофитSQL Но... не работает. Нельзя rowid использовать ни с distinct, ни с group by. по одному наймолодшему в отделе Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
..... stax Станислав, прочтите первое сообщение и предоставленные данные. Вы правильно оперируете с датами, но у автора авторНужно вывести прейскурант на сегодня Что в его понятии сегодня - непонятно ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 14:41 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
K790, В запросах тем не менее у ТС есть поле day. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 15:01 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
env, что это за day, тоже непонятно - ранк? автор???? as LastUpdate, ???? as LastPrice я опирался на этот момент - что этим хотел сказать автор? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 15:19 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
посыпаю голову пеплом, понял. тогда вопрос как построена архитектура? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 15:25 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
извините, что слишком много, но тем не менее, приведенных планов нет и отвечать на вопрос авторне могу выбрать оптимальный не имеет смысла. может там базенка на пару терабайт ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 15:31 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
env НеофитSQL Вообще-то я рассчитывал что клюнет env Клюнет на что? На бред с min/max по rowid, который зависит от фазы Луны, положения Венеры в Тельце, enable row movement и прочих телодвижений с блоками? НеофитSQL они в каждой группе одинаковые Концепции прочтите вы уже... Таки клюнул. Зачем? Уже ж все объяснили. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Вы разберетесь сами на этом примере, почему здесь МАХ не дает максимальную цену, и почему его можно заменить на MIN или AVG? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 17:58 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
НеофитSQL, max по rowid для блока with построенного на dual? Месье знает толк в извращениях. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 18:00 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
На этом примере куда лучше видно, что адекватно формулировать свою задачу у вас не получается. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 18:01 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
Stax НеофитSQL Но... не работает. Нельзя rowid использовать ни с distinct, ни с group by. по одному наймолодшему в отделе Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
..... stax Вы, однако, извращенец. После моего комментария я увидел что загвоздка с rowid была из-за inline views, я вначале неправильно прочитал сообщение об ошибке, и написал об этом. 22243959 А потом кто-то увидел max(rowid), недочитал строку, и началось... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 18:03 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
K790 посыпаю голову пеплом, понял. тогда вопрос как построена архитектура? Пример был игрушечный, т.к. ответ на него отвечал на мой вопрос - как получить "главную" строку из каждой группы без дополнительных колонок. Главную - как определяет мой критерий сортировки, и группировка по нескольким колонкам. В игрушечном примере группировка по двум колонкам, а сортировка - по "day". Я подозревал что ответ который дает колонку rowid - оптимальный, потому что доступ по rowid бесплатный, и потому что rowid существует, исходя из постановки задачи (выдать строки целиком по критерию). Но у меня не получалось его написать, т.к. я забыл что у CTE нет rowid. Потом, с подсказкой от SY и других, все получилось. 22243959 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 18:11 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
env На этом примере куда лучше видно, что адекватно формулировать свою задачу у вас не получается. Некоторым танцорам штаны мешают ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 18:13 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
НеофитSQL Вы разберетесь сами на этом примере, почему здесь МАХ не дает максимальную цену, и почему его можно заменить на MIN или AVG? авторЦены не более одного раза в день обновляются обновите цену два раза в день (без времени), и будет Вам max ps если order by ... не уникально строку с помощью keep не выбрать ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 18:15 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
НеофитSQL Потом, с подсказкой от SY и других, все получилось. 22243959 ??? Моя "подсказка" была с MAX/MIN ROWID ничего не выйдет. Stax показал "дедовский" метод которым мы пользовались в дремучие времена когда Oracle не поддерживал аналитические ф-ции. А моя основная "подсказка" была используй SCD2 - цена меняется мах 2 раза в день а выбирается куда больше раз. Так-что потери на изменение цены через SCD2 с лихвой окупятся при выборке. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 19:08 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
> обновите цену два раза в день (без времени), Тогда условия задачи требуют корректировки, т.к. "последняя цена" не определена. Если "любая из последних", то MAX подойдет, и MIN подойдет, а вот с AVG будут проблемы. Эх, надо было AVG(rowid) написать. Жаль, что это не число :) Для параноиков как я, в таблицу можно добавить уникальный constraint по (prod,clr,day). A в квери - поставить "бомбу" которая ее сломает если все-таки появились дупликаты. Чтоб неповадно. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 19:11 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
SY НеофитSQL Потом, с подсказкой от SY и других, все получилось. 22243959 ??? Моя "подсказка" была с MAX/MIN ROWID ничего не выйдет. Stax показал "дедовский" метод которым мы пользовались в дремучие времена когда Oracle не поддерживал аналитические ф-ции. А моя основная "подсказка" была используй SCD2 - цена меняется мах 2 раза в день а выбирается куда больше раз. Так-что потери на изменение цены через SCD2 с лихвой окупятся при выборке. SY. Я говорил про 22243953 . Там пример был чужой и сломанный, но теперь у меня свой и как env уже увидел, правильно работающий. Про SCD2 почитаю на будущее. Сейчас не применю, т.к. строил одноразовый отчет по архивным данным. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 19:16 |
|
Группировка с нахождением новейших строк.
|
|||
---|---|---|---|
#18+
НеофитSQL Некоторым танцорам штаны мешают Купите штаны пошире (официальную поддержку). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 09:03 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1880630]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
66ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 324ms |
total: | 482ms |
0 / 0 |