Результаты выборки с условиями в улье sql

У меня есть таблица, которая не имеет первичного ключа и разделена по дате; столбцы как это:

1. user_id  
2. device
3. region
4. datetime
5. and other columns

Он содержит сгенерированные пользователем события из игры на сайте, они запускаются каждую секунду. Я хочу вернуть пакет со всеми событиями (включая повторяющиеся строки), сгенерированными первыми 6 пользователями (верх таблицы) в текущий день, которые проверяют условия:

для региона = США

- one user from iOS
- one user from android
- one user from PC

для региона = ЕС

- one user from iOS
- one user from android
- one user from PC

Можете ли вы предоставить пример кода, с которого я должен начать? Мой друг предложил кое-что о RANK(), но я никогда не использовал его.

Спасибо!

SELECT * FROM 
    (SELECT user_id, 
    event_post_time, 
    device, 
    region, 
    COUNT(DISTINCT player_id) over (partition by player_id) as ct_pid, 
    COUNT(DISTINCT region) over (partition by region) as ct_region, 
    COUNT(DISTINCT device) over (partition by device) as ct_device 
    FROM events 
    WHERE event_post_time = current_date() 
    AND region IN ('EU','US') 
    AND device IN ('ios','android','pc')) e 
WHERE ct_pid <= 6 
AND ct_region <= 2 
AND ct_device <= 3 
ORDER BY player_id

Добавление фиктивных данных в SQLFiddle и ожидаемый вывод:

user_id device region date_generated
  1  ios  EU  22-05-18
  1  ios  EU  22-05-18
  1  ios  EU  22-05-18
  4  ios  US  22-05-18
  4  ios  US  22-05-18
  2  android  EU  22-05-18
  2  android  US  22-05-18
  4  pc  EU  22-05-18
  4  pc  EU  22-05-18
  4  pc  EU  22-05-18
  5  pc  US  22-05-18

1 ответ

Решение

Вероятно, это то, что вы ищете.

select * from (
select rank() over (partition by region,device order by cn desc) as
top_num,player_id, region,device,cn from 
(
select count(*) as cn , player_id,region,device from 
test_table group by player_id,region,device 
)l
)t 
where top_num = 1;

Позвольте мне знать, если это помогает.

OP EDIT: мне удалось заставить его работать на то, что я хотел, используя ваш запрос; вот последний

WITH combo 
 AS (SELECT user_id, 
            region, 
            device 
     FROM   (SELECT Rank() 
                      OVER ( 
                        partition BY region, device 
                        ORDER BY cn DESC) AS top_num, 
                    user_id, 
                    region, 
                    device, 
                    cn 
             FROM   (SELECT Count(*) AS cn, 
                            user_id, 
                            region, 
                            device 
                     FROM   samples 
                     GROUP  BY user_id, 
                               region, 
                               device)l)t 
     WHERE  top_num = 1) 
SELECT s.user_id, 
   s.region, 
   s.device 
FROM   samples s 
   JOIN combo 
     ON s.user_id = combo.user_id 
        AND s.region = combo.region 
        AND s.device = combo.device 
Другие вопросы по тегам