| BG Development · За реклама · За контакти |
Помощ Търсене Потребители Календар Правила |
| Здравей! ( Включване | Регистриране ) |
| Страници: (4) [1] 2 3 ... последна » ( Първото ново мнение ) | ![]() ![]() ![]() |
| Gamma Goblin |
Публикувано на: 19-08-2019, 06:57
|
||
![]() Име: Група: Потребител Ранг: Почетен член Мнения: 4014 Регистриран на: 21.02.18 |
Задача: Намерете най-наеманите категории по клиент. Примерно:
|
||
| thrawn |
Публикувано на: 19-08-2019, 07:54
|
![]() Име: Група: Потребител Ранг: Почетен член Мнения: 3864 Регистриран на: 17.01.17 |
На каква база данни?
Е това сериозно ли го пускаш като задача? Групираш по клиент и категория и извеждаш редът с максимален count. Да видим, за какво се ползва having. Ако базата данни има window функции, можеш да ги ползваш за определяне на ранг на всеки групиран запис и да изведеш само записите с ранг 1. Това мнение е било редактирано от thrawn на 19-08-2019, 07:55 |
| Gamma Goblin |
Публикувано на: 19-08-2019, 08:27
|
||
![]() Име: Група: Потребител Ранг: Почетен член Мнения: 4014 Регистриран на: 21.02.18 |
На каквато искаш база Не е толкова лесно защото трябва да изведеш най-наемната категория по клиент:
Аз го нацъках, но ми е доста бавно - 23 секунди и ми е интересно дали няма по-просто решение. Ще изчакам още малко, някой може да иска да се помъчи. PP: С WindowFunctions го свалих на 100мс Това мнение е било редактирано от Gamma Goblin на 19-08-2019, 08:53 |
||
| Gamma Goblin |
Публикувано на: 19-08-2019, 17:09
|
||||||
![]() Име: Група: Потребител Ранг: Почетен член Мнения: 4014 Регистриран на: 21.02.18 |
Обща част:
това ми беше първия опит:
Обаче е брутално бавно (23сек), с едно индексче малко се ускорява (пада на 3 сек), но пак е бавно. Като спомена WindowFunctions, написах следното което минава за около 100мс:
Интересно ми е дали има по-просто/чисто/бързо решение ? |
||||||
| dvader |
Публикувано на: 19-08-2019, 17:25
|
![]() Име: Валерий Тодоров Група: VIP Ранг: Почетен член Мнения: 5419 Регистриран на: 12.07.05 |
del
Това мнение е било редактирано от dvader на 19-08-2019, 17:29 -------------------- I find your lack of faith disturbing
|
| thrawn |
Публикувано на: 19-08-2019, 18:01
|
![]() Име: Група: Потребител Ранг: Почетен член Мнения: 3864 Регистриран на: 17.01.17 |
Нещо не ми допада това решение.
Трябва ти максимална категория по клиент, което значи, че задължително ти трябва групиране по двете полета. След това ти трябва категорията с максимален count(*) от групите. Най-лесно се получава като номераш всеки ред от групата и избереш само първите (като ги сортираш низходящо) с window функция: row_number() over (order by count(*) desc) За съжаление съм на телефон и не мога да пиша sql. Интересния момент тук е, какво правим ако две категории са с равни показатели? Ако ти трябва просто някоя от тях row_number върши работа. Има обаче и вариант да изведеш о двете. Тогава си трябва rank. Това мнение е било редактирано от thrawn на 19-08-2019, 18:02 |
| Gamma Goblin |
Публикувано на: 19-08-2019, 18:11
|
![]() Име: Група: Потребител Ранг: Почетен член Мнения: 4014 Регистриран на: 21.02.18 |
Ето схемата в DB Fiddle на който му се играе (няма данни! - свалете си ги от първия линк в гитхъб): https://www.db-fiddle.com/f/22KucUrFud3aQ6zFMVTKCc/0
|
| Gamma Goblin |
Публикувано на: 19-08-2019, 18:27
|
||||
![]() Име: Група: Потребител Ранг: Почетен член Мнения: 4014 Регистриран на: 21.02.18 |
ами с row_number()/rank() заявката изглежда по-същия начин и даже се генерира почти същия план и отнема същтото време
Това мнение е било редактирано от Gamma Goblin на 19-08-2019, 18:35 |
||||
| thrawn |
Публикувано на: 19-08-2019, 18:43
|
![]() Име: Група: Потребител Ранг: Почетен член Мнения: 3864 Регистриран на: 17.01.17 |
Прави join- овете на края, когато си отсял максимално данните.
Прави тестовете само с данните в rental и чак когато получиш това което ти трябва го линкни с останалите таблици. ---edit--- https://www.db-fiddle.com/f/22KucUrFud3aQ6zFMVTKCc/1 нещо такова, ама не мога да го тествм с данни. Това мнение е било редактирано от thrawn на 19-08-2019, 19:06 |
| dvader |
Публикувано на: 19-08-2019, 19:52
|
||
![]() Име: Валерий Тодоров Група: VIP Ранг: Почетен член Мнения: 5419 Регистриран на: 12.07.05 |
С коментарите съм съгласен, ама с твойто куери не съм много съгласен. Правиш групиране по customer/inventory но можеш да имаш различни inventory с едно и също film_category. Според мен групирането трябва да е по customer + category. -------------------- I find your lack of faith disturbing
|
||
Страници: (4) [1] 2 3 ... последна » |
![]() ![]() ![]() |