Я пытаюсь перенести запрос из Oracle в SQL Server 2014.
Вот мой запрос, который прекрасно работает в Oracle:
select
count(distinct A) over (partition by B) / count(*) over() as A_B
from MyTable
Вот ошибка, которую я получил после того, как попытался выполнить этот запрос в SQL Server 2014.
Use of DISTINCT is not allowed with the OVER clause
Кто-нибудь знает в чем проблема? Возможен ли такой запрос в SQL Server? Пожалуйста, порекомендуйте.
MyTable
? Или достаточно четких рядов? И вам не нужно учитывать ошибку деления на ноль, если в ней нет строкMyTable
?Ответы:
Нет, в настоящее время это не реализовано. См. Следующий запрос элемента подключения.
Запрос расширения предложения OVER - предложение DISTINCT для агрегатных функций
Другой возможный вариант будет
приведение к
NUMERIC
там, чтобы избежать целочисленного деления. Причина предложения объединения объясняется здесь .Его можно заменить на,
ON M.B = T.B OR (M.B IS NULL AND T.B IS NULL)
если предпочтительнее (или просто,ON M.B = T.B
еслиB
столбец не обнуляем).источник
Это дает отчетливый счет (*) для A, разделенного на B:
источник
A
не обнуляется (поскольку я думаю, что это также учитывает нули).abs(dense_rank - dense_rank) + 1
я верю.Вы можете принять максимальное значение,
dense_rank()
чтобы получить четное число A, разделенное на B.Чтобы позаботиться о случае, когда A может иметь нулевые значения, вы можете использовать,
first_value
чтобы выяснить, присутствует ли нулевое значение в разделе или нет, а затем вычесть 1, если это соответствует предложению Мартина Смита в комментарии.источник
Попробуйте выполнить подзапрос, сгруппировав по A, B и включив количество. Затем в вашем внешнем запросе ваш счет (отличный) становится обычным, а ваш (*) становится суммой (cnt).
источник