Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборка из базы наиболее часто встречающихся значений / 3 сообщений из 3, страница 1 из 1
08.09.2021, 12:44
    #40095941
xeken
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из базы наиболее часто встречающихся значений
Добрый день, есть БД, в которую пишутся результаты битв карточной игры.
Структура базы такая:
ruleset"mana_cap""summoner_id""monster_1_id""monster_2_id""monster_3_id""monster_4_id""monster_5_id""monster_6_id"Standard"15""109""131""50""230""51"""""Standard"15""109""131""50""47""138"""""Standard"15""112""129""51""54""136"""""Standard"15""109""136""229"""""""""Standard"15""109""136""50""51"""""""Standard"15""11""209""52"""""""""Standard"15""109""229""136"""""""""

Необходимо сделать выборку такого плана:
1) Указываем значение mana_cap, например 15, выбираем.
2) В выбранных строках необходимо выбрать по столбцу summoner_id наиболее часто встречающееся значение
3) Из результатов выборки пункта 2 необходимо выбрать по столбцу monster_1_id наиболее часто встречающееся значение и так до monster_6_id

Скурил уже весь google, но так и не пойму как это сделать, помогите пожалуйста

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

Код: 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.
  ( SELECT summoner_id 
    FROM battles where mana_cap ='12'
    GROUP BY summoner_id
    ORDER BY COUNT(*) DESC
           , summoner_id DESC
    LIMIT 1
  ) AS summoner_id,

  ( SELECT monster_1_id
    FROM battles where mana_cap ='12'
    GROUP BY monster_1_id
    ORDER BY COUNT(*) DESC
           , monster_1_id DESC
    LIMIT 1
  ) AS monster_1_id,
  
    ( SELECT monster_2_id
    FROM battles where mana_cap ='15'
    GROUP BY monster_2_id
    ORDER BY COUNT(*) DESC
           , monster_2_id DESC
    LIMIT 1
  ) AS monster_2_id,
  
    ( SELECT monster_3_id
    FROM battles where mana_cap ='12'
    GROUP BY monster_3_id
    ORDER BY COUNT(*) DESC
           , monster_3_id DESC
    LIMIT 1
  ) AS monster_3_id,
  
      ( SELECT monster_4_id
    FROM battles where mana_cap ='12'
    GROUP BY monster_4_id
    ORDER BY COUNT(*) DESC
           , monster_4_id DESC
    LIMIT 1
  ) AS monster_4_id;
  
...
Рейтинг: 0 / 0
08.09.2021, 14:41
    #40096005
londinium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из базы наиболее часто встречающихся значений
Если я правильно понял задачу, то можно попробовать что-то такое

Код: 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.
WITH CTE(RULESET,MANA_CAP,SUMMONER_ID,MONSTER_1_ID,MONSTER_2_ID,MONSTER_3_ID,MONSTER_4_ID,MONSTER_5_ID,MONSTER_6_ID)AS
  (
    SELECT 'STANDARD',15,109,131,50,230,51,0,0  UNION ALL 
    SELECT 'STANDARD',15,109,131,50,47,138,0,0  UNION ALL 
    SELECT 'STANDARD',15,112,129,51,54,136,0,0  UNION ALL 
    SELECT 'STANDARD',15,109,136,229,0,0,0,0  UNION ALL 
    SELECT 'STANDARD',15,109,136,50,51,0,0,0   UNION ALL 
    SELECT 'STANDARD',15,11,209,52,0,0,0,0    UNION ALL
    SELECT 'STANDARD',15,109,229,136,0,0,0,0  
  ),
C2 AS
  (
    SELECT C.SUMMONER_ID
    FROM CTE AS C
    WHERE C.MANA_CAP=15
    GROUP BY C.SUMMONER_ID
    ORDER BY COUNT(C.SUMMONER_ID)DESC
    LIMIT 1
  )
SELECT C.SUMMONER_ID,MONSTER_1.MONSTER_1_ID,MONSTER_2.MONSTER_2_ID,MONSTER_3.MONSTER_3_ID
  FROM C2 AS C
  LEFT JOIN LATERAL
  (
    SELECT X.MONSTER_1_ID
     FROM CTE AS X
     WHERE C.SUMMONER_ID=X.SUMMONER_ID AND X.MANA_CAP=15
     GROUP BY X.MONSTER_1_ID
     ORDER BY COUNT(X.MONSTER_1_ID)DESC 
     LIMIT 1
  )MONSTER_1 ON TRUE
  LEFT JOIN LATERAL
  (
     SELECT X.MONSTER_2_ID
     FROM CTE AS X
     WHERE C.SUMMONER_ID=X.SUMMONER_ID AND X.MANA_CAP=15
     GROUP BY X.MONSTER_2_ID
     ORDER BY COUNT(X.MONSTER_2_ID)DESC 
     LIMIT 1
  )MONSTER_2 ON TRUE 
  LEFT JOIN LATERAL
  (
     SELECT X.MONSTER_3_ID
     FROM CTE AS X
     WHERE C.SUMMONER_ID=X.SUMMONER_ID AND X.MANA_CAP=15
     GROUP BY X.MONSTER_3_ID
     ORDER BY COUNT(X.MONSTER_3_ID)DESC 
     LIMIT 1
  )MONSTER_3 ON TRUE
...
Рейтинг: 0 / 0
08.09.2021, 15:13
    #40096018
xeken
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из базы наиболее часто встречающихся значений
londinium, спасибо огромное, то что нужно!!!!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборка из базы наиболее часто встречающихся значений / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]