Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Проектирование БД |
![]() ![]() |
забыл ник Member Откуда: Сообщений: 3510 |
Всем привет, базы не мой основной профиль, застрял на одном вопросе, предполагаю что все должно быть просто но никак не соберусь с мыслями чтобы реализовать. Допустим есть CREATE TABLE gifts(sender varchar, recipient varchar, text varchar) Мне нужно сгруппировать данные таким образом, чтобы узнать какая пара между собой сделала больше всего подарков, т.е. мне надо sum(*) where a.sender = b.recipient or a.recipient = b.sender Я написал набрсоок поделки, но он нещадно тупит. select count(*), a.recipient as rec, a.sender as sen from (select sender, recipient from gifts) as a,(select sender, recipient from gifts) as b where a.sender = b.recipient or a.recipient = b.sender group by rec,sen order by 1 Так вот, может кто знает как правильно называются такие запросы, я даже сформулировать нормально не могу, чтобы погуглить. Буду рад любой помощи(а работающему запросу безмерно рад) |
28 июл 19, 11:22 [21936153] Ответить | Цитировать Сообщить модератору |
забыл ник Member Откуда: Сообщений: 3510 |
база Postgres, количество записей пока полмиллиона, медленно растет, но не сильно, это данные где-то за 10 лет |
28 июл 19, 11:23 [21936155] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
group by min(sender,recipient), mах(sender,recipient) Не помню точно название функции, но идею ты должен понять. |
28 июл 19, 12:23 [21936170] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Вспомнилgroup by LEAST(sender,recipient), GREATEST(sender,recipient) |
28 июл 19, 12:29 [21936171] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Не знаю, используются ли они для нечисловых переменных. |
28 июл 19, 12:31 [21936174] Ответить | Цитировать Сообщить модератору |
ChA Member Откуда: Москва Сообщений: 11224 |
Навскидку как-то так CREATE TABLE gifts(sender varchar, recipient varchar) INSERT INTO gifts (sender, recipient) VALUES (1, 2) ,(1, 3) , (1, 4) , (2, 3) , (3, 1) , (3, 4) , (3, 2) SELECT [One] , [Two] , COUNT(*) AS N FROM ( SELECT sender AS [One] , recipient AS [Two] FROM gifts UNION ALL SELECT recipient AS [One] , sender AS [Two] FROM gifts ) t WHERE [One] > [Two] GROUP BY [One], [Two] ORDER BY N DESC DROP TABLE gifts |
28 июл 19, 12:51 [21936180] Ответить | Цитировать Сообщить модератору |
забыл ник Member Откуда: Сообщений: 3510 |
Спасибо ребята, все взлетело. А я 3 часа никак не мог сообразить) |
28 июл 19, 13:10 [21936185] Ответить | Цитировать Сообщить модератору |
vadiminfo Member Откуда: Обнинск Сообщений: 4802 |
select * from ( select sender, resipient, cnt, max(cnt) over () m from ( select sender, resipient, count(*) cnt from gifts group by sender, resipient ) ) where cnt = m |
28 июл 19, 14:01 [21936195] Ответить | Цитировать Сообщить модератору |
vadiminfo Member Откуда: Обнинск Сообщений: 4802 |
В догонку. Запрос проверен в Оракле. Но Постгри вроде имеет родственный язык БД. Запрос вернет несколько записей, если несколько пар сделали больше всего подарков, но совпадают между собой. Например, несли наибольшее число 10. И две пары сделали по 10, то оде окажутся в результате. Запрос имеет и аналитическую ф-ю и групповую. Но они обе для аналитических отчетов. |
28 июл 19, 14:07 [21936198] Ответить | Цитировать Сообщить модератору |
vadiminfo Member Откуда: Обнинск Сообщений: 4802 |
вдогонку. На основном компе буфер обмена с браузером не работает (Вин 10), на втором не все клавиши нажимаются. Поэтому один ответ пришлось разбить на два. |
28 июл 19, 14:10 [21936201] Ответить | Цитировать Сообщить модератору |
vadiminfo Member Откуда: Обнинск Сообщений: 4802 |
нашел что подкрутить чтобы буфер заработал. Не совсем как бы очевидно: пришлось включить журнал буфера обмена. Ну не гады они там? |
28 июл 19, 14:19 [21936204] Ответить | Цитировать Сообщить модератору |
Все форумы / Проектирование БД | ![]() |