SQL-запрос - найти строку, которая превышает совокупную долю - PullRequest
3 голосов
/ 27 октября 2011

Скажем, у меня есть таблица данных, которая выглядит следующим образом:

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 без циклов или курсоров , чтобы вернуть first ItemNo что превышает совокупную пропорцию?

Другими словами, если «пропорция», которую я хотел проверить, составляла 35%, первая строка, которая превышает это значение, ItemNo 3, потому что 0,15 + 0,10 + 0,15 = 0,40

Точно так же, если бы я хотел найти первую строку, которая превысила 75%, это было бы ItemNo 7 как сумма всех Proportion до тех пор, пока эта строка не станет меньше 0,75.

Ответы [ 2 ]

5 голосов
/ 27 октября 2011
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
3 голосов
/ 27 октября 2011

Классика для оконной функции:

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, как указано ниже.

...