복붙노트

[SQL] 어떻게 같은 SELECT 문에서 DISTINCT와 ORDER BY를 사용 하는가?

SQL

어떻게 같은 SELECT 문에서 DISTINCT와 ORDER BY를 사용 하는가?

다음 문을 실행 한 후 :

SELECT  Category  FROM MonitoringJob ORDER BY CreationDate DESC

나는 데이터베이스에서 다음 값을 얻고있다 :

test3
test3
bildung
test4
test3
test2
test1

하지만이 같은 제거 중복을 원하는 :

bildung
test4
test3
test2
test1

나는 DISTINCT를 사용하려고하지만, 하나 개의 문장에 ORDER BY 작동하지 않습니다. 도와주세요.

중대한:

해결법

  1. ==============================

    1.문제는 ORDER BY에 사용 된 열이 DISTINCT에 지정되지 않은 것입니다. 이렇게하려면, 당신은에 정렬 집계 함수를 사용하고 DISTINCT 작업을 만들기 위해 GROUP BY를 사용해야합니다.

    문제는 ORDER BY에 사용 된 열이 DISTINCT에 지정되지 않은 것입니다. 이렇게하려면, 당신은에 정렬 집계 함수를 사용하고 DISTINCT 작업을 만들기 위해 GROUP BY를 사용해야합니다.

    이 같은 시도 :

    SELECT DISTINCT Category, MAX(CreationDate) 
    FROM MonitoringJob 
    GROUP BY Category 
    ORDER BY MAX(CreationDate) DESC, Category
    
  2. ==============================

    2.싶은 것은 일을하지 않는 이유 때문에 첫 번째 쿼리 (간체)되고, SQL에서 작업의 논리적 인 순서이다 :

    싶은 것은 일을하지 않는 이유 때문에 첫 번째 쿼리 (간체)되고, SQL에서 작업의 논리적 인 순서이다 :

    그래서, SQL 표준 덕분에 그것이 일시적 장면 뒤에 추가되고 있기 때문에, SELECT 절에없는 무언가에 의해 주문 완전히 가능하다 정렬 키 열 기능을 확장했다.

    우리는 DISTINCT 작업을 추가하면 SELECT와 ORDER BY 사이에 추가 될 것이다 :

    결과가 더 이상 동일하지 않게하지만 지금은 확장 된 분류 키 열에서 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에 대해 블로그에 있습니다.

  3. ==============================

    3.원래의 질문의 예처럼 - - MAX (에서 CreationDate)의 출력이 원하지 않는 경우 유일한 대답은 Prashant 굽타의 대답의 두 번째 문입니다 :

    원래의 질문의 예처럼 - - MAX (에서 CreationDate)의 출력이 원하지 않는 경우 유일한 대답은 Prashant 굽타의 대답의 두 번째 문입니다 :

    SELECT [Category] FROM [MonitoringJob] 
    GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC
    

    설명 : Prutswonder의 대답에 문이이 경우에 쓸모없는 있도록, 인라인 함수에서 ORDER BY 절을 사용할 수 없습니다, 당신은 외부가 주위에 선택 넣고 MAX (에서 CreationDate) 부분을 폐기 할 수 없다.

  4. ==============================

    4.당신은 [분류]의 값과 [에서 CreationDate] 열을 원하는 경우에 다만,이 코드를 사용

    당신은 [분류]의 값과 [에서 CreationDate] 열을 원하는 경우에 다만,이 코드를 사용

    SELECT [Category], MAX([CreationDate]) FROM [MonitoringJob] 
                 GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC
    

    당신은 [분류] 컬럼의 값을 원하는 경우 또는이 코드를 사용합니다.

    SELECT [Category] FROM [MonitoringJob] 
    GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC
    

    혹시 당신이 원하는 모든 별개의 기록을해야합니다.

  5. ==============================

    5.원래 결과는 "TEST3는"복수의 결과를 한 것으로 나타났다 ...

    원래 결과는 "TEST3는"복수의 결과를 한 것으로 나타났다 ...

    이 그룹으로의에서 중복을 제거하기 위해 MAX 모든 시간을 사용하기 시작 ... 그리고 잊지 또는 기본 질문이 무엇인지 무시하는 것은 매우 쉽습니다 ...

    영업 이익은 아마도 사용하여 MAX가 그에게주는 것을 깨달았다 마지막으로 "창조"와 MIN을 사용하여 "창조"첫 줄 것이다 ...

  6. ==============================

    6.

    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
    
  7. ==============================

    7.하위 쿼리함으로써 작동합니다 :

    하위 쿼리함으로써 작동합니다 :

        SELECT distinct(Category) from MonitoringJob  where Category in(select Category from MonitoringJob order by CreationDate desc);
    
  8. ==============================

    8.오름차순으로 고유의 뜻 정렬 기록합니다. 당신은 내림차순 순서 사용 정렬 할 경우 :

    오름차순으로 고유의 뜻 정렬 기록합니다. 당신은 내림차순 순서 사용 정렬 할 경우 :

    SELECT DISTINCT Category
    FROM MonitoringJob
    ORDER BY Category DESC
    

    당신이에서 CreationDate의 필드를 기준으로 정렬 기록하려는 경우,이 필드는 선택 문에 있어야합니다 :

    SELECT DISTINCT Category, creationDate
    FROM MonitoringJob
    ORDER BY CreationDate DESC
    
  9. ==============================

    9.당신은 CTE를 사용할 수 있습니다 :

    당신은 CTE를 사용할 수 있습니다 :

    WITH DistinctMonitoringJob AS (
        SELECT DISTINCT Category Distinct_Category FROM MonitoringJob 
    )
    
    SELECT Distinct_Category 
    FROM DistinctMonitoringJob 
    ORDER BY Distinct_Category DESC
    
  10. ==============================

    10.다음 시도하지만 거대한 데이터에 대한 유용한 아니다 ...

    다음 시도하지만 거대한 데이터에 대한 유용한 아니다 ...

    SELECT DISTINCT Cat FROM (
      SELECT Category as Cat FROM MonitoringJob ORDER BY CreationDate DESC
    );
    
  11. ==============================

    11.그것은이처럼 내부 쿼리를 사용하여 수행 할 수 있습니다

    그것은이처럼 내부 쿼리를 사용하여 수행 할 수 있습니다

    $query = "SELECT * 
                FROM (SELECT Category  
                    FROM currency_rates                 
                    ORDER BY id DESC) as rows               
                GROUP BY currency";
    
  12. ==============================

    12.

    SELECT DISTINCT Category FROM MonitoringJob ORDER BY Category ASC
    
  13. from https://stackoverflow.com/questions/5391564/how-to-use-distinct-and-order-by-in-same-select-statement by cc-by-sa and MIT license