:
;WITH LastPerUser AS
(
SELECT
ID, UserID, ClassID, SchoolID, Created,
ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY Created DESC) AS 'RowNum'
FROM dbo.YourTable
)
SELECT
ID, UserID, ClassID, SchoolID, Created,
FROM LastPerUser
WHERE RowNum = 1
이 CTE "파티션"UserID
하여 데이터, 각 파티션에 대해 ROW_NUMBER
함수는 1부터 시작하여 Created DESC
에 의해 정렬 된 순차 번호를 전달합니다. 따라서 가장 최근 행은 RowNum = 1
(각 UserID
에 해당)을 얻습니다.이 후 바로 SELECT 문에서 CTE에서 선택합니다.
이
;WITH LastPerUser AS
(
SELECT
ID, UserID, ClassID, SchoolID, Created,
ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY Created DESC) AS 'RowNum'
FROM dbo.YourTable
)
DELETE FROM dbo.YourTable t
FROM LastPerUser cte
WHERE t.ID = cte.ID AND cte.RowNum > 1
같은 원리가 적용됩니다 : 당신은 쉽게 중복을 삭제할 수 있습니다 동일한 CTE를 사용
각 데이터에 대한 "그룹"(또는 파티션) 데이터를 어떤 기준으로하면 연속적으로 번호 모든 행 파티션 및 "파티션 된 행 번호"에 대해 1보다 큰 값을 갖는 파티션은 DELETE
에 의해 제거됩니다.
집계 함수에서 사용하는 것을 '그룹화'할 수 없습니다. 나는 당신이'id by group'을 의미한다고 생각합니다. –
@marc_s 감사합니다! –
DB에서 dups를 제거하려고합니다. MSSQL은 이것을 단순하게 만들지 않으며, 이것은 "검색"을 끝내고 DB의 작업에서 항상 사용됩니다. 처음에는 dups를 막을 수있는 방법이 있어야하지만 이것은 내 DB 및 응용 프로그램이 아닙니다. –