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, как прокомментировано ниже.

Другие вопросы по тегам