SQL групп внутри групп - PullRequest
       7

SQL групп внутри групп

0 голосов
/ 10 января 2020

У меня есть данные транзакций, как в этом примере:

Name    | Price
George  | 20
George  | 20
George  | 20
George  | 30
Paul    | 20
Paul    | 20
Paul    | 30
Paul    | 30
Paul    | 35

Мне нужно сгруппировать по пользователям и отсортировать по количеству транзакций в целом, но внутри этой группы пользователей также делаются группы по упорядочению цен по количество транзакций по этой цене. Мне нужен этот результат:

Name    | Price | Count
Paul    | 20    | 2
Paul    | 30    | 2
Paul    | 35    | 1
George  | 20    | 3
George  | 30    | 1

ОБНОВЛЕНИЕ

Он находится в базе данных MySQL 5.5. Мне нужно сделать запрос на свободный в Laravel, но иметь его в SQL - это большой прогресс.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 10 января 2020
SELECT t1.*
FROM ( SELECT name, 
              price, 
              COUNT(*) cnt
       FROM srctable
       GROUP BY name, price ) t1
JOIN ( SELECT name, 
              COUNT(*) tcnt
       FROM srctable
       GROUP BY name ) t2 USING (name)
ORDER BY tcnt DESC, 
         cnt DESC;

скрипка

0 голосов
/ 10 января 2020

Вот ты go. Это можно сделать в MySQL 8.x. Требуемый двойной порядок требует использования пары табличных выражений, как показано ниже:

select
  x.name, x.price, x.cnt
from (
  select name, price, count(*) as cnt
  from t
  group by name, price
) x
join (
  select name, row_number() over(order by cnt desc) as ob
  from (
    select name, count(*) as cnt
    from t
    group by name
  ) y
) z on x.name = z.name
order by z.ob, x.cnt desc

Результат:

name    price  cnt
------  -----  ---
Paul       20    2
Paul       30    2
Paul       35    1
George     20    3
George     30    1

Для справки, я использовал скрипт данных:

create table t (
  name varchar(10),
  price int
);

insert into t (name, price) values
  ('George', 20),
  ('George', 20),
  ('George', 20),
  ('George', 30),
  ('Paul', 20),
  ('Paul', 20),
  ('Paul', 30),
  ('Paul', 30),
  ('Paul', 35);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...