Как генерировать диапазоны столбца на основе условия - PullRequest
4 голосов
/ 23 января 2020

Есть столбец с номерами. Я хотел бы разработать отчет, в котором значения этого столбца разбиты на диапазоны (нижний предел и верхний предел). Такое разделение должно произойти, если разница в значениях превышает 10. Это достижимо с помощью запроса в Power BI или SQL Server?

Current column structure

Required Structure

Ответы [ 2 ]

3 голосов
/ 23 января 2020

Решение GMB, безусловно, является каноническим подходом к решению этой проблемы, рассматривая его как вариант пробелов и островков. Мне было интересно, если есть способ сделать это без двух уровней подзапросов. И есть:

select coalesce(lag(next_x) over (order by x), first_x) as lower,
       x as upper
from (select t.*,
             first_value(x) over (order by x) as first_x,
             lead(x) over (order by x) as next_x
      from t
     ) t
where next_x is null or next_x > x + 10;

Здесь - это дБ <> скрипка.

Было бы интересно сравнить производительность на большом наборе данных - 2 оконные функции + агрегация против 3 оконных функций + фильтрация.

3 голосов
/ 23 января 2020

В SQL я бы использовал lag() и окно sum() для определения групп, а затем агрегировал:

select min(x) lower_limit, max(x) upper_limit
from (
    select x, sum(case when x <= lag_x + 10 then 0 else 1 end) over(order by x) grp
    from (select x, lag(x) over(order by x) lag_x from mytable) t
) t
group by grp

lag() дает предыдущее значение. Затем оконная сумма реализует следующую логику c: каждый раз, когда разница между текущим и предыдущим значением превышает 10, начинается новая группа. Наконец, внешний запрос агрегирует по группам и вычисляет нижнюю и верхнюю границы.

...