выберите лучшие 30 процентов записей за каждый день - PullRequest
0 голосов
/ 01 мая 2018

У меня есть таблица sales для хранения транзакций на каждый день.

Date    Receipt Total
4/21/2018   325 600
4/21/2018   326 800
4/21/2018   327 500
4/21/2018   328 900
4/21/2018   329 500
4/26/2018   330 600
4/26/2018   331 1080
4/26/2018   332 1200
4/26/2018   333 1120
4/29/2018   334 600
4/29/2018   335 1400
5/1/2018    336 1500
5/1/2018    337 4000
5/1/2018    338 6000

Из приведенной выше таблицы мне нужно выбрать верхние 30 процентов записей для каждого дня, и таблица должна выглядеть так, как показано ниже.

Date    Receipt Total
4/21/2018   325 600
4/21/2018   326 800
4/26/2018   330 600
4/26/2018   331 1080
4/29/2018   334 600
5/1/2018    336 1500
5/1/2018    337 4000

Я использовал следующий код:

SELECT TOP 30 percent *       
FROM sales
GROUP BY Date

1 Ответ

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

Вы можете использовать row_number() с partition by date и сверять с количеством 30% от общего количества за каждый день.

select date,receipt,total 
from   (select *, 
               ceiling(tc * 30.00 / 100.00) as under30 
        from   (select date, 
                       receipt, 
                       total, 
                       row_number() over(partition by date  order by (select null)) rn, 
                       count(*) over(partition by date order by (select null)) tc 
                from   sales) t
         ) t1 
where  rn <= under30  

DEMO

Выход:

+------------+---------+-------+
| date       | receipt | total |
+------------+---------+-------+
| 2018-04-21 | 325     | 600   |
+------------+---------+-------+
| 2018-04-21 | 326     | 800   |
+------------+---------+-------+
| 2018-04-26 | 330     | 600   |
+------------+---------+-------+
| 2018-04-26 | 331     | 1080  |
+------------+---------+-------+
| 2018-04-29 | 334     | 600   |
+------------+---------+-------+
| 2018-05-01 | 336     | 1500  |
+------------+---------+-------+

Примечание: Если вы хотите, чтобы в этом случае было 30% от общего количества, вам нужно изменить логику вычисления количества, как показано в приведенном выше запросе.

  count(*) over(order by (select null)) tc 
...