Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Проектирование БД Новый топик    Ответить
 Ступор в построении запроса  [new]
забыл ник
Member

Откуда:
Сообщений: 2945
Всем привет, базы не мой основной профиль, застрял на одном вопросе, предполагаю что все должно быть просто но никак не соберусь с мыслями чтобы реализовать.

Допустим есть
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]     Ответить | Цитировать Сообщить модератору
 Re: Ступор в построении запроса  [new]
забыл ник
Member

Откуда:
Сообщений: 2945
база Postgres, количество записей пока полмиллиона, медленно растет, но не сильно, это данные где-то за 10 лет
28 июл 19, 11:23    [21936155]     Ответить | Цитировать Сообщить модератору
 Re: Ступор в построении запроса  [new]
982183
Member

Откуда: VL
Сообщений: 3104
group by min(sender,recipient), mах(sender,recipient)

Не помню точно название функции, но идею ты должен понять.
28 июл 19, 12:23    [21936170]     Ответить | Цитировать Сообщить модератору
 Re: Ступор в построении запроса  [new]
982183
Member

Откуда: VL
Сообщений: 3104
Вспомнил
group by LEAST(sender,recipient), GREATEST(sender,recipient)
28 июл 19, 12:29    [21936171]     Ответить | Цитировать Сообщить модератору
 Re: Ступор в построении запроса  [new]
982183
Member

Откуда: VL
Сообщений: 3104
Не знаю, используются ли они для нечисловых переменных.
28 июл 19, 12:31    [21936174]     Ответить | Цитировать Сообщить модератору
 Re: Ступор в построении запроса  [new]
ChA
Member

Откуда: Москва
Сообщений: 10844
Навскидку как-то так
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]     Ответить | Цитировать Сообщить модератору
 Re: Ступор в построении запроса  [new]
забыл ник
Member

Откуда:
Сообщений: 2945
Спасибо ребята, все взлетело. А я 3 часа никак не мог сообразить)
28 июл 19, 13:10    [21936185]     Ответить | Цитировать Сообщить модератору
 Re: Ступор в построении запроса  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4757
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]     Ответить | Цитировать Сообщить модератору
 Re: Ступор в построении запроса  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4757
В догонку.
Запрос проверен в Оракле. Но Постгри вроде имеет родственный язык БД.
Запрос вернет несколько записей, если несколько пар сделали больше всего подарков, но совпадают между собой. Например, несли наибольшее число 10. И две пары сделали по 10, то оде окажутся в результате.
Запрос имеет и аналитическую ф-ю и групповую. Но они обе для аналитических отчетов.
28 июл 19, 14:07    [21936198]     Ответить | Цитировать Сообщить модератору
 Re: Ступор в построении запроса  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4757
вдогонку.
На основном компе буфер обмена с браузером не работает (Вин 10), на втором не все клавиши нажимаются. Поэтому один ответ пришлось разбить на два.
28 июл 19, 14:10    [21936201]     Ответить | Цитировать Сообщить модератору
 Re: Ступор в построении запроса  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4757
нашел что подкрутить чтобы буфер заработал. Не совсем как бы очевидно: пришлось включить журнал буфера обмена. Ну не гады они там?
28 июл 19, 14:19    [21936204]     Ответить | Цитировать Сообщить модератору
Все форумы / Проектирование БД Ответить