|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
Добрый день, подскажите, пожалуйста, можно ли решить данный вопрос средствами over, partition и т.д.; если да, то как. Суть вопроса: есть таблица с двумя колонками column A | column B A | value_q A | value_q A | value_q A | value_w A | value_w A | value_q B | value_q B | value_q B | value_w B | value_w какой запрос нужно написать, чтобы получить такой результат?: column A | column B | flag A | value_q | 1 A | value_q | 2 A | value_q | 3 A | value_w | 1 A | value_w | 2 A | value_q | 1 B | value_q | 1 B | value_q | 2 B | value_w | 1 B | value_w | 2 т.е. чтобы начинать отсчитывать row_number каждый раз с единицы при смене значения в column A, или column B ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2019, 18:56 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
d20190801, Поищите на оракловой ветке форума - start_of_group Подход один-в-один реализуется на PG ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 01:45 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
Щукина Анна, спасибо! Разобрался. p.s. для тех, кто будет читать - нужно использовать оператор CASE и подходящую аналитическую функцию, чтобы вышло, например, такое выражение: select *, case when (column_a != lag(column_a) over() OR column_b != lag(column_b) over()) -- это как раз и есть способ разделения значений на группы по своему условию then '1' else '0' end border_flag from table; -- затем можно добавить sum(border_flag) over() border_sum и получить одинаковое значение на всю группу, чтобы уже снова применить аналитическую row_number() over (partition by border_sum) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2019, 16:35 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
d20190801, наверное я чего то не понял, но чем задача отличается от : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2019, 09:58 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
qwwq, тем, что вы не внимательно смотрели: 0,0,1 0,0,2 0,0,3 0,1,1 0,1,2 0,1,3 0,0,1 0,1,1 0,2,1 0,2,2 Например так, т.е. изменение любого из a или б в следующей строке ИСХОДНОГО набора данных начинает нумерацию с 1. В вашем случае уже все отсортировано по a,b, в исходном примере другая последовательность строк. Задача интересная, правда не понимаю прикладной смысл. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2019, 23:28 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
Trogloditqwwq, тем, что вы не внимательно смотрели: <> Например так, т.е. изменение любого из a или б в следующей строке ИСХОДНОГО набора данных начинает нумерацию с 1. В вашем случае уже все отсортировано по a,b, в исходном примере другая последовательность строк. Задача интересная, правда не понимаю прикладной смысл. снкс, понял правда "исходного" набора данных какбы теоретицки не существует. если нет ордербая с некой очевидностью, данный класс задач взывает к обобщению описания окна "оконных" ф-й a-la Код: sql 1.
с тем , чтобы не писать самопального однопроходного скана с аналитикой на предсортированном курсоре/recursive CTE, т.к. реализация алгоритмически очевидна, дело за расширением декларации ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 14:09 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
d20190801Щукина Анна, спасибо! Разобрался. p.s. для тех, кто будет читать - нужно использовать оператор CASE и подходящую аналитическую функцию, чтобы вышло, например, такое выражение: select *, case when (column_a != lag(column_a) over() OR column_b != lag(column_b) over()) -- это как раз и есть способ разделения значений на группы по своему условию then '1' else '0' end border_flag from table; -- затем можно добавить sum(border_flag) over() border_sum и получить одинаковое значение на всю группу, чтобы уже снова применить аналитическую row_number() over (partition by border_sum) Код: sql 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. 30. 31. 32. 33. 34. 35. 36.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 20:47 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
Dany305, это кажется 3 сорта. а бег по курсору -- всего один пресорт. т.е. алгоритмически много проще. но если не пускаться в фантазии про курсоры , кажется такая шняжка тоже рабочая (могу врать) и на один сорт короче (наверняка где-то вру) : Код: sql 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.
тест Код: sql 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2019, 11:02 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
Мой вариант: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2019, 19:54 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
TrogloditМой вариант: мимо? > Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2019, 10:50 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
qwwq, Да что то я совсем в молоко попал. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2019, 20:29 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
Troglodit, тяпничное решение : (если кляуза не идёт к погромисту , ) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
-- надо подумать, может ли хвост обогнать тушку, хотя бы теоретиццки ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 13:53 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
Пятничное решение. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 23:58 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
Я, может быть, чего-то не вижу... но зачем во всех решениях PARTITION BY? Разве просто Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
не достаточно? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2019, 12:17 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
PgSQLanonymous3, Да вы правы достаточно, просто переделывал запрос, это хвосты остались. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2019, 13:38 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
Troglodit, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
похоже, вы накопали решение с одной сортировкой. достойно букваря по окнам d g;. планы почти совпадают ценой с однопроходным. (планировщик обещается обойтись одним сортом по входным, несмотря на вложенность) Код: sql 1. 2. 3. 4. 5.
но почему-то полные фетчи данных в пж-одминЪ-3 (с локальной субд) отличаются стабильно в ~3--4 раза Код: sql 1. 2. 3. 4. 5. 6. 7.
кто б объяснил, почему. если ширина и типы полей совпадают ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 11:47 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
qwwq, Я попробовал ваш запрос у меня выполняется более 3с., мой 0.13. Одно замечание: я запускал на pg12 beta. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 19:55 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
Trogloditqwwq, Я попробовал ваш запрос у меня выполняется более 3с., мой 0.13. Одно замечание: я запускал на pg12 beta. какой "вашъ" и какой "мой" ? уточните. и приведите полный explain analyze обоих. интересно посмотреть в чем разница. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 22:47 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
qwwq, Ваш вариант. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Мой Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
План не смотрел, запускал несколько раз запросы, я на точность не претендую, просто наблюдение. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 22:57 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
Ваш: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Мой Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 23:14 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
Все понятно, на виртуалке мало ресурсов, он на диск сбрасывает в вашем варианте, поэтому так медленно. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 23:16 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
TrogloditВсе понятно, на виртуалке мало ресурсов, он на диск сбрасывает в вашем варианте, поэтому так медленно. дело не в этом. оба сравнённые вами варианты "ваши". самое существенное отличие -- размер выборки отличается на 2 порядка. я в 21946974 только перефразировал ваш запрос -- в редакции PgSQLanonymous3 на случай нуллабл полей в группе. и раскрыл нулл-иф более читабельным для меня эквивалентом. с неотличимыми затратами на выполнение. мои же циферки выше по треду -- это сравнение прямого прохода в лоб с корявым но очевидным хаком через сиквенс 21945605 . и "вашего" двухколенчатого, но тоже односортного -- в моей редакции 21946974 . на одинаковых объёмах. они практически совпали. и ещё -- вы зря вернулись к цте -- у вас появился лишний сорт , по сравнению с редакцией PgSQLanonymous3 . если не вру. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2019, 07:31 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
qwwq, соврал. в 10-ке бы появился. в 12 оно кажется не материализует. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2019, 07:33 |
|
Проставить row_number, сбрасывая его при каждой смене значений
|
|||
---|---|---|---|
#18+
документирую сиквенсом Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Код: sql 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. 30.
окном-макс-фильтр Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Код: sql 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. 30. 31. 32. 33.
CTE9.6 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Код: sql 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2019, 10:06 |
|
|
start [/forum/search_topic.php?author=iformats&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 440ms |
total: | 613ms |
0 / 0 |