다음 문을 실행 한 후 :
SELECT Category FROM MonitoringJob ORDER BY CreationDate DESC
데이터베이스에서 다음 값을 얻습니다.
test3
test3
bildung
test4
test3
test2
test1
하지만 다음과 같이 중복을 제거하고 싶습니다.
bildung
test4
test3
test2
test1
DISTINCT를 사용하려고했지만 하나의 문에서 ORDER BY와 함께 작동하지 않습니다. 도와주세요.
중대한:
-
나는 그것을 시도했다 :
SELECT DISTINCT Category FROM MonitoringJob ORDER BY CreationDate DESC
작동하지 않습니다.
-
CreationDate에 의한 주문은 매우 중요합니다.
답변
문제는에서 사용 된 열 ORDER BY
이 DISTINCT
. 이렇게하려면 집계 함수 를 사용하여 정렬하고 a GROUP BY
를 사용하여 DISTINCT
작업을 수행해야합니다.
다음과 같이 시도하십시오.
SELECT DISTINCT Category, MAX(CreationDate)
FROM MonitoringJob
GROUP BY Category
ORDER BY MAX(CreationDate) DESC, Category
답변
확장 된 정렬 키 열
원하는 작업이 작동하지 않는 이유는 첫 번째 쿼리의 경우 다음 과 같은 SQL 의 논리적 작업 순서 때문입니다 .
FROM MonitoringJob
SELECT Category, CreationDate
즉, 소위 확장 정렬 키 열 추가ORDER BY CreationDate DESC
SELECT Category
즉 , 결과에서 확장 된 정렬 키 열을 다시 제거합니다 .
따라서 SQL 표준 확장 정렬 키 열 기능 덕분에 SELECT
절에 일시적으로 추가되므로 절에 없는 항목으로 정렬 하는 것이 완전히 가능 합니다.
그렇다면 왜 이것이 작동하지 DISTINCT
않습니까?
DISTINCT
연산 을 추가하면 SELECT
과 사이에 추가됩니다 ORDER BY
.
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
하지만 지금은 확장 된 정렬 키 열 CreationDate
을 사용하여 DISTINCT
작업 의 의미 가 변경되었으므로 결과가 더 이상 동일하지 않습니다. 이것은 우리가 원하는 것이 아니므로 SQL 표준과 모든 합리적인 데이터베이스 모두 이러한 사용을 금지합니다.
해결 방법
다음과 같은 표준 구문으로 에뮬레이션 할 수 있습니다.
SELECT Category
FROM (
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
) t
ORDER BY CreationDate DESC
또는 Prutswonder에 의해 표시된 것처럼 간단히 (이 경우)
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
ORDER BY CreationDate DESC
여기에서 SQL DISTINCT 및 ORDER BY에 대해 자세히 블로그에 올렸습니다 .
답변
MAX (CreationDate)의 출력이 원하지 않는 경우-원래 질문의 예에서와 같이-유일한 대답은 Prashant Gupta의 대답에 대한 두 번째 진술입니다.
SELECT [Category] FROM [MonitoringJob]
GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC
설명 : 인라인 함수에서 ORDER BY 절을 사용할 수 없으므로이 경우 Prutswonder의 답변에있는 문을 사용할 수 없습니다.이 경우 외부 선택을 넣을 수없고 MAX (CreationDate) 부분을 버릴 수 없습니다.
답변
[Category] 및 [CreationDate] 열의 값을 원하는 경우이 코드를 사용하십시오.
SELECT [Category], MAX([CreationDate]) FROM [MonitoringJob]
GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC
또는 [Category] 열의 값만 원하는 경우이 코드를 사용합니다.
SELECT [Category] FROM [MonitoringJob]
GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC
원하는대로 모든 고유 한 레코드를 갖게됩니다.
답변
2) CreationDate의 순서는 매우 중요합니다.
원래 결과는 “test3″에 여러 결과가 있음을 나타냅니다.
항상 MAX를 사용하여 Group By의 중복 항목을 제거하고 근본적인 질문이 무엇인지 잊어 버리거나 무시하는 것은 매우 쉽습니다.
OP는 아마도 MAX를 사용하는 것이 그에게 마지막 “생성”을 제공하고 MIN을 사용하면 첫 번째 “생성”을 제공한다는 것을 깨달았을 것입니다.
답변
if object_id ('tempdb..#tempreport') is not null
begin
drop table #tempreport
end
create table #tempreport (
Category nvarchar(510),
CreationDate smallint )
insert into #tempreport
select distinct Category from MonitoringJob (nolock)
select * from #tempreport ORDER BY CreationDate DESC
답변
하위 쿼리로 작동합니다.
SELECT distinct(Category) from MonitoringJob where Category in(select Category from MonitoringJob order by CreationDate desc);
