|
|
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
Приветствую. Имеются данные: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Нужно получить: 1 a 1111 3 2 a 1112 5 3 b 1112 7 4 b 1113 4 5 b 1114 3 Т.е. в запросе оставить только 1-е 3 топовые позиции по cc. Надо бы подкрутить аналитическую функцию :-) но я не знаю как, помогите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 17:57 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
Петров Андрей, row_number() ? Версия субд какая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 17:59 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
Немного подправил запрос: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 17:59 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 18:01 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
А для 11 только так? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 18:05 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
envПетров Андрей, для 12c посмотри эту тему Поскольку ТСу не надо делать соединений - аналитика вполне подходящее решение. В той теме суть в том, что благодаря lateral можно сортировать только соединяемые данные для каждой строки, а не весь recordset после соединения. Если еще углубиться в ту тему, можно сначала сортировать все соединяемые данные, потом фильтровать, потом соединять, но можно придумать данные когда lateral будет эффективнее. Итого, представим, что во внутренней таблице 10 строк, во внешней 10 млн (по миллиону на строку главной), при этом нас интересуют ТОП 100 только для трех строк из главной. В зависимости от подхода будет примерно следующая последовательность действий Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 19:00 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, Отсылка туда была на случай, если ТС привёл вырожденный случай, чтобы потом было меньше вопросов вида "а если мне надо первые 10 из другой таблицы". С твоим стилем изложения можно следующую книгу будет по комментариям в темах собирать, практически без редакторской правки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 10:17 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop lateral 3 раза сортировка по 1 млн, фильтр 300 каким образом получаете 3 из десяти? ps сложилось впечатление что результат lateral может зависеть от order by в главном аля выполняется с учетом сортировки select * from t,lateral(select * from tt where t.x=tt.x) order by t.y .... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 11:19 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 11:35 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 11:39 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 11:39 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
stax..dbms_photoshoplateral 3 раза сортировка по 1 млн, фильтр 300 каким образом получаете 3 из десяти?dbms_photoshopпри этом нас интересуют ТОП 100 только для трех строк из главнойЕсли следующим вопросом будет почему я выдумал эту тройку, то ответ: чтоб обратить внимание, что будет выполнятся сортировка разного числа строк для первых двух случаев при наличии фильтра по главной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 13:42 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopstax..пропущено... каким образом получаете 3 из десяти?dbms_photoshopпри этом нас интересуют ТОП 100 только для трех строк из главнойЕсли следующим вопросом будет почему я выдумал эту тройку, то ответ: чтоб обратить внимание, что будет выполнятся сортировка разного числа строк для первых двух случаев при наличии фильтра по главной. вопрос был не в етом 1 вариант) select * from (select * from t10 where rownum<4), lateral (select * from t100000 ...FIRST 100 ROWS) 2 вариант) select * from t10, lateral (select * from t100000 ...FIRST 100 ROWS) ... FIRST 3 ROWS 3) ....? 4) ....? ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 13:51 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
xtenderК слову CBO умеет трансформировать laterals так что в некоторых случаях может оказаться что будет один хэшджойнНу я писал в своей pdf, что переписывание ansi в native совершенствуется и запросы, которые всегда порождали lateral в десятке могут быть без оной в 11-ке (это же высказывание верно если взять 11 и 12 для иного типа запросов). xtenderи еще: https://hourim.wordpress.com/2017/03/25/de-correlated-lateral-view-vw_dcl_mmm/ Тут важно что оно может быть декоррелировано только если оно и так не скоррелировано логически. :) Иными словами, нормальный разработчик не будет писать Код: plsql 1. 2. 3. вместо Код: plsql 1. 2. 3. Но если это написано, то оно будет "декоррелировано" с применением HASH JOIN и в 11. Это же применимо к запросам порождаемым CBO при переписывании ANSI в native. Если же lateral логически нужен, то Оракл от него никак не избавится. Возвращаясь к моему примеру с lateral и сортировками я сомневаюсь что там может быть что-то кроме "сортировка набора получаемого из дочерней для каждой строки главной". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 14:03 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
stax..dbms_photoshopпропущено... пропущено... Если следующим вопросом будет почему я выдумал эту тройку, то ответ: чтоб обратить внимание, что будет выполнятся сортировка разного числа строк для первых двух случаев при наличии фильтра по главной. вопрос был не в етом 1 вариант) select * from (select * from t10 where rownum<4), lateral (select * from t100000 ...FIRST 100 ROWS) 2 вариант) select * from t10, lateral (select * from t100000 ...FIRST 100 ROWS) ... FIRST 3 ROWS 3) ....? 4) ....? ..... staxОткуда это все? У меня третий пример с lateral, первые два - обычные соединения и аналитика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 14:11 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
Раз (кроме того, что я написал Оракл наверное может сделать NL + window pushed rank) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Два Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Три ансишный синтаксис (тут будет NL + stopkey) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Три оракловый синтаксис Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. PS. Предполагается что фильтр "t10.sign = 1" возвращает три строки главной. Кардинальности взяты с потолка - не надо искать в них глубокий смысл. PPS. Я уже когда-то писал, что синтаксический сахар для TOP N - это больше маркетинговый ход (типа в Оракле такое тоже есть) и для людей плохо владеющих SQL типа бизнес аналитиков. Для разработчиков это не стоит рассматривать всерьез. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 14:29 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopИными словами, нормальный разработчик не будет писать Код: plsql 1. 2. 3. вместо Код: plsql 1. 2. 3. Ну я тогда не "нормальный разработчик" Дело в том, что я сталкивался со случаем, когда у Код: plsql 1. и Код: plsql 1. нормально пушились предикаты в view2, view3(там были джойны и группировки внутри), а в Код: plsql 1. пушились либо в view2 либо в view3, но вместе никак не хотели работать. И именно в такой ситуации дело решалось как раз lateral: Код: plsql 1. 2. 3. Поэтому я советую в сложных динамических запросах добавлять не через "join x on ....", а "lateral(select .... from x where ...) dbms_photoshopЕсли же lateral логически нужен, то Оракл от него никак не избавится.вообще это не cost-based трансформация, а эвристическая, поэтому тут сложно сказать какие конкретно у него правила ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 14:32 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
xtenderИ именно в такой ситуации дело решалось как раз lateralПравильно я понял, что они пропушились и метод соединения был HJ чего нельзя было добиться без lateral? В таком случае я бы назвал это workaround для косяка оптимизатора а не best practice. xtenderсложно сказать какие конкретно у него правилаУ эвристических трансформаций правило простое - применять всегда когда может быть применено. Другое дело, что в некоторых случаях применено быть не может. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 14:40 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
Нет, кажись я неправильно понял. Лучше конкретный пример какого плана нельзя добиться без lateral (для которого легко можно вынести предикат с корреляцией наружу). Профит в стоимости вторичен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 14:50 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopУ эвристических трансформаций правило простое - применять всегда когда может быть применено.ты путаешь с rule-based: Их не два типа(CBQT и Heurustic), а 3: Путь иерархии ТипALL -> COMPILATION -> TRANSFORMATION Rule basedALL -> COMPILATION -> TRANSFORMATION -> CBQT CostedALL -> COMPILATION -> TRANSFORMATION -> HEURISTIC Heuristic basedps. путь иерархии отсюда: http://blog.tanelpoder.com/2013/04/01/understanding-what-a-hint-affects-using-the-vsql_feature-views/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 14:50 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopПравильно я понял, что они пропушились и метод соединения был HJ чего нельзя было добиться без lateral?нет, NL был в обоих случаях, просто с lateral предикаты пропушились, а не считалась сначала агрегация вся и потом фильтровалась ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 14:51 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopstax..пропущено... вопрос был не в етом 1 вариант) select * from (select * from t10 where rownum<4), lateral (select * from t100000 ...FIRST 100 ROWS) 2 вариант) select * from t10, lateral (select * from t100000 ...FIRST 100 ROWS) ... FIRST 3 ROWS 3) ....? 4) ....? ..... staxОткуда это все? У меня третий пример с lateral, первые два - обычные соединения и аналитика. вот я про третий и спрашиваю, как он выглядит? ps для меня необычные и первые два (вернее не знаю как латерал заменить обычным соеденением), но ето не важно зыы с FIRST 3 ROWS очепятался ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 15:00 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
xtenderdbms_photoshopУ эвристических трансформаций правило простое - применять всегда когда может быть применено.ты путаешь с rule-based: Их не два типа(CBQT и Heurustic), а 3: Путь иерархии ТипALL -> COMPILATION -> TRANSFORMATION Rule basedALL -> COMPILATION -> TRANSFORMATION -> CBQT CostedALL -> COMPILATION -> TRANSFORMATION -> HEURISTIC Heuristic basedps. путь иерархии отсюда: http://blog.tanelpoder.com/2013/04/01/understanding-what-a-hint-affects-using-the-vsql_feature-views/ Я подразумеваю, что речь идет про CBO и использую терминологию из http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-general-query-optimization-10gr-130948.pdf Oracle has implemented a wide range of SQL transformations. These broadly fall into two categories: heuristic query transformations : These transformations are applied to incoming SQL statements whenever possible. These transformations always provide equivalent or better query performance, so that Oracle knows that applying these transformations will not degrade performance. cost-based query transformations : Oracle uses a cost-based approach for several classes of query transformations. Using this approach, the transformed query is compared to the original query, and Oracle’s optimizer then selects the best execution strategyЕще раз подчеркну, что не всегда возможно применить эвристическую трансформацию и получить эквивалентный запрос - это именно то, что я пытался сказать. PS. Всякие view merging могут применяться для RBO, но это не то о чем интересно разговаривать в виду практической бесполезности в наши дни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 15:08 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
stax..вот я про третий и спрашиваю, как он выглядит?Я надеюсь ты просколлил до моего следующего ответа и увидел, что я имел в виду совершенно иные запросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 15:08 |
|
||
|
Выбрать первые 3 позиции в группировке
|
|||
|---|---|---|---|
|
#18+
xtenderdbms_photoshopПравильно я понял, что они пропушились и метод соединения был HJ чего нельзя было добиться без lateral?нет, NL был в обоих случаях, просто с lateral предикаты пропушились, а не считалась сначала агрегация вся и потом фильтроваласьЕсть подозрение, что нужного эффекта можно было бы добиться если создать дополнительную inline view и в ней соединять с view2, а снаружи с view3. Создавать lateral view для которого можно элементарно вынести предикат с корреляцией наружу имхо весьма misleading и я однозначно старался бы этого избежать за исключением случая если иными способами нужного плана достичь невозможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 15:12 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=162&tid=1885922]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 412ms |

| 0 / 0 |
