SQL-запрос - найти строку, которая превышает совокупную долю
Скажем, у меня есть таблица данных, которая выглядит следующим образом:
ItemNo | ItemCount | Proportion
------------------------------------------
1 3 0.15
2 2 0.10
3 3 0.15
4 0 0.00
5 2 0.10
6 1 0.05
7 5 0.25
8 4 0.20
Другими словами, есть всего 20 пунктов, и совокупная доля каждого ItemNo
суммы до 100%. Здесь важен порядок строк таблицы.
Можно ли выполнить SQL-запрос без циклов или курсоров, чтобы вернуть первый ItemNo
что превышает совокупную пропорцию?
Другими словами, если "пропорция", которую я хотел проверить, составляла 35%, первая строка, которая превышает это ItemNo 3
потому что 0,15 + 0,10 + 0,15 = 0,40
Точно так же, если бы я хотел найти первый ряд, который превысил 75%, это было бы ItemNo 7
, как сумма всех Proportion
до тех пор, пока этот ряд не станет меньше 0,75.
2 ответа
select top 1
t1.ItemNo
from
MyTable t1
where
((select sum(t2.Proportion) from MyTable t2 where t2.ItemNo <= t1.ItemNo) >= 0.35)
order by
t1.ItemNo
Классика для оконной функции:
SELECT *
FROM (
SELECT ItemNo
,ItemCount
,sum(Proportion) OVER (ORDER BY ItemNo) AS running_sum
FROM tbl) y
WHERE running_sum > 0.35
LIMIT 1;
Работает в PostgreSQL, среди прочего.
Или в нотации tSQL (которую вы, похоже, используете): ВЫБЕРИТЕ ТОП 1 * ОТ ( ВЫБЕРИТЕ ItemNo , ItemCount , сумма (пропорция) OVER (ORDER BY ItemNo) AS running_sum ОТ tbl) y ГДЕ идущая_сумма> 0,35;
Не работает в tSQL, как прокомментировано ниже.