#sql #sql-server #database #tsql
#sql #sql-сервер #База данных #tsql
Вопрос:
Я уверен, что в таблице есть строки с повторяющимися значениями столбцов:
SELECT
TenancyReferralKey,
FromDate,
ToDate,
ToDate_Value,
ReferralID,
ReferralFor,
ReferralStatus
FROM dm.Dim_TenancyReferral
WHERE ReferralID IN ('1138', '1940', '1946')
ORDER BY ReferralID
И я пытаюсь подсчитать количество строк с дублированными ReferralID
:
SELECT
TenancyReferralKey,
FromDate,
ToDate,
ToDate_Value,
ReferralID,
ReferralFor,
ReferralStatus,
COUNT(*) [Occurrences]
FROM dm.Dim_TenancyReferral
GROUP BY
TenancyReferralKey,
FromDate,
ToDate,
ToDate_Value,
ReferralID,
ReferralFor,
ReferralStatus
HAVING COUNT(*) > 1
Но получаю пустой результирующий набор.
Спасибо за вашу помощь.
Ответ №1:
Вы группируетесь по количеству неуникальных столбцов ( TenancyReferralKey
, FromDate
, ToDate
, ToDate_Value
). Если вы удалите их, вы получите нужные вам дубликаты, например
SELECT
ReferralID,
ReferralFor,
ReferralStatus,
COUNT(*) [Occurrences]
FROM dm.Dim_TenancyReferral
GROUP BY
ReferralID,
ReferralFor,
ReferralStatus
HAVING COUNT(*) > 1
Ответ №2:
Отредактируйте COUNT
инструкцию в своем запросе. COUNT(*) [Occurrences]
подсчитывает количество строк в таблице при группировании по всем столбцам в GROUP BY
инструкции. Таким образом, каждая строка имеет свой собственный набор значений (нет случаев, когда вся запись является дубликатом). Попробуйте
WITH cte AS (
SELECT
TenancyReferralKey,
FromDate,
ToDate,
ToDate_Value,
ReferralID,
ReferralFor,
ReferralStatus,
COUNT(*) OVER (PARTITION BY ReferralID) AS Occurences
FROM dm.Dim_TenancyReferral
)
SELECT
*
FROM
cte
WHERE
Occurences > 0
;
Комментарии:
1. Спасибо за эту разработку и показ CTE. Я посмотрю на
OVER
PARTITION BY
ключевые слова and .