Результаты выборки с условиями в улье sql - PullRequest
0 голосов
/ 21 мая 2018

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

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 Ответ

0 голосов
/ 22 мая 2018

Возможно, это то, что вы ищете.

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 
...