Я пытаюсь получить отчетливое количество строк в оконной функции с несколькими уровнями секционирования. Ниже пример моих данных.
| КОД ТОВАРА | KEY_ID | КЛАСТЕР МАГАЗИНОВ |
|---|---|---|
| 1000078 | 120 | ЛЛНИ |
| 1000078 | 202 | ЛЛФ |
| 1000078 | 202 | ЛЛНИ |
| 1000078 | 202 | ЛЛНИ |
Я хочу посмотреть на каждый PRODUCT_ID, а затем на каждый уникальный KEY_ID и определить, сколько уникальных STORECLUSTERS приходится на KEY_ID. Например, PRODUCT_ID 1000078 имеет два уникальных KEY_ID (120 и 202), из которых 120 имеет 1 уникальный STORECLUSTER, а 202 имеет 2 уникальных STORECLUSTER. Я пробовал использовать RANK() и DENSE_RANK(), но не могу правильно разбить на разделы. Я хотел бы получить таблицу, которая выглядит так:
| КОД ТОВАРА | KEY_ID | КЛАСТЕР МАГАЗИНОВ | STORECLUSTER_COUNT |
|---|---|---|---|
| 1000078 | 120 | ЛЛНИ | 1 |
| 1000078 | 202 | ЛЛФ | 2 |
| 1000078 | 202 | ЛЛНИ | 2 |
| 1000078 | 202 | ЛЛНИ | 2 |





К сожалению, SQL Server не поддерживает COUNT(DISTINCT в качестве оконной функции.
Итак, вам нужно вложить оконные функции. Я считаю, что самый простой и эффективный метод — это MAX над DENSE_RANK, но есть и другие.
Предложение о разделении эквивалентно GROUP BY в обычном агрегате, тогда значение, которое вы DISTINCT вводите, входит в ORDER BYDENSE_RANK. Таким образом, вы вычисляете рейтинг, игнорируя одинаковые результаты, а затем берете максимальный ранг для каждого раздела.
SELECT
PRODUCT_ID,
KEY_ID,
STORECLUSTER,
STORECLUSTER_COUNT = MAX(rn) OVER (PARTITION BY PRODUCT_ID, KEY_ID)
FROM (
SELECT *,
rn = DENSE_RANK() OVER (PARTITION BY PRODUCT_ID, KEY_ID ORDER BY STORECLUSTER)
FROM YourTable t
) t;
Пожалуйста, покажите нам свою попытку, чтобы мы могли помочь вам с ней.