powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборка из базы наиболее часто встречающихся значений
3 сообщений из 3, страница 1 из 1
Выборка из базы наиболее часто встречающихся значений
    #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
Выборка из базы наиболее часто встречающихся значений
    #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
Выборка из базы наиболее часто встречающихся значений
    #40096018
xeken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
londinium, спасибо огромное, то что нужно!!!!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборка из базы наиболее часто встречающихся значений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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