ПОДСЧЕТ как функция окна вызывает ошибку msg 4403 на SQL Server

#sql #sql-server #tsql #window-functions

#sql #sql-сервер #tsql #оконные функции

Вопрос:

Это мой код:

 WITH ActivityCTE AS (  SELECT DISTINCT   id,  COUNT(*) OVER (PARTITION BY id) ctn  FROM   dailyActivity_merged$ ) DELETE ActivityCTE WHERE ctn lt;gt; 31  

Может ли кто-нибудь объяснить мне, почему COUNT() функция, используемая в окне, выдает сообщение об ошибке 4403?

Не удается обновить представление или функцию «ActivityCTE», поскольку она содержит агрегаты, или ОТДЕЛЬНОЕ предложение или предложение GROUP BY, или оператор PIVOT или UNPIVOT.

введите описание изображения здесь

Я пытаюсь удалить некоторые записи из своей таблицы, в которых нет 31 записи, используя CTE.

Комментарии:

1. Нам не нужно изображение, когда вы указали запрос текст ошибки.

2. А что касается того, почему — это по замыслу.

3. Я бы начал с: SELECT DISTINCT так как ошибка указывает: or a DISTINCT

4. Что вы на самом деле пытаетесь сделать? Это отображается в вашем SQL, как будто вы пытаетесь удалить из CTE, но это не соответствует вашему объяснению.

5. @Andrew Вы можете удалять строки из таблицы с помощью CTE

Ответ №1:

Count(*) не в этом корень ошибки.

Подробности сообщения об ошибке ...DISTINCT...

 WITH ActivityCTE AS(  SELECT *  ,COUNT(*) OVER( PARTITION BY id) ctn  FROM dailyActivity_merged$ ) DELETE FROM ActivityCTE WHERE ctn lt;gt; 31  

Ответ №2:

FWIW, я бы написал это с помощью ГРУППЫ/НАЛИЧИЯ, а не функции окна, и удалил бы из фактической таблицы, как это:

 WITH ActivityCTE AS(  SELECT id  FROM dailyActivity_merged$  GROUP BY id  HAVING count(*) lt;gt; 31 ) DELETE dam FROM dailyActivity_merged$ dam INNER JOIN ActivityCTE cte on cte.id = dam.id