Как упорядочить числа в столбце по группам?

Как можно сгруппировать числа из столбца таким образом, чтобы они были разделены на группы в зависимости от наличия нулей между ними при использовании MS SQL?
  • 25 июня 2024 г. 9:52
Ответы на вопрос 2
Для упорядочивания чисел в столбце по группам в зависимости от наличия нулей между ними, можно воспользоваться функцией ROW_NUMBER() в MS SQL Server.

Пример запроса:

```sql
WITH CTE AS (
    SELECT *, 
    ROW_NUMBER() OVER (ORDER BY [your_column_name] DESC) - ROW_NUMBER() OVER (PARTITION BY CASE WHEN [your_column_name] = 0 THEN 1 ELSE 0 END ORDER BY [your_column_name] DESC) AS grp
    FROM [your_table_name]
)
SELECT [your_column_name], 
grp
FROM CTE
ORDER BY grp, [your_column_name] DESC;
```

В данном примере мы используем два оконных функции ROW_NUMBER(): одну для присвоения номера каждой строки в общем порядке убывания значений столбца, и вторую для присвоения номера каждой строки внутри группы в зависимости от наличия нулей между значениями. 

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

Таким образом, числа будут упорядочены по группам в зависимости от наличия нулей между ними.
Ну если совсем влоб, то 
WITH cte AS (
  SELECT id, 
         num, 
         LAG(num) OVER (ORDER BY id) lag_num
  FROM test
)
SELECT id, 
       num,
       CASE WHEN num <> 0
            THEN SUM(CASE WHEN num <> 0 AND lag_num = 0 THEN 1 ELSE 0 END) OVER (ORDER BY id) 
            ELSE 0
            END [group]
FROM cte

Сработает неправильно, если самая первая запись ненулевая... ну это как-нить сам поправь. Мне лень.
Похожие вопросы