복붙노트

[SQL] DISTINCT를 통해 여러 열을 계산

SQL

DISTINCT를 통해 여러 열을 계산

이 같은 쿼리를 수행하는 더 좋은 방법이 있나요 :

SELECT COUNT(*) 
FROM (SELECT DISTINCT DocumentId, DocumentSessionId
      FROM DocumentOutputItems) AS internalQuery

나는이 테이블에서 고유 한 항목의 수를 계산해야하지만, 서로 다른 두 개의 열 이상이다.

내 쿼리는 잘 작동하지만 난 (하위 쿼리를 사용하지 않고) 하나의 쿼리를 사용하여 최종 결과를 얻을 수 있는지 궁금 해서요

해결법

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

    1.성능을 향상하려는 경우, 당신은 해시 또는 두 열의 연결된 값 중 하나에 지속 계산 열을 만드는 시도 할 수 있습니다.

    성능을 향상하려는 경우, 당신은 해시 또는 두 열의 연결된 값 중 하나에 지속 계산 열을 만드는 시도 할 수 있습니다.

    이 지속되면 열이 결정적 제공하고 "제정신"데이터베이스 설정을 사용하고, 그것은 색인 및 / 또는 통계는 그것을 만들 수 있습니다.

    나는 계산 된 컬럼의 고유 한 카운트 검색어에 해당 될 것입니다 생각합니다.

  2. ==============================

    2.편집 : 신뢰성이 낮은 검사 전용 쿼리에서 변경된 나를 위해 꽤 잘 작동 (SQL Server 2005에서) 할 수있는 방법을 발견 한 나는 내가 필요로 (체크섬 () 함수에 추가하여) 많은 열로 사용할 수 있습니다. 기능으로 VARCHAR로의 int를 회전 () 역은 별개의 안정성을 높이기합니다

    편집 : 신뢰성이 낮은 검사 전용 쿼리에서 변경된 나를 위해 꽤 잘 작동 (SQL Server 2005에서) 할 수있는 방법을 발견 한 나는 내가 필요로 (체크섬 () 함수에 추가하여) 많은 열로 사용할 수 있습니다. 기능으로 VARCHAR로의 int를 회전 () 역은 별개의 안정성을 높이기합니다

    SELECT COUNT(DISTINCT (CHECKSUM(DocumentId,DocumentSessionId)) + CHECKSUM(REVERSE(DocumentId),REVERSE(DocumentSessionId)) )
    FROM DocumentOutPutItems
    
  3. ==============================

    3.당신이 좋아하지 않아 기존 쿼리에 대해 무엇입니까? 당신이 두 개의 열에서 DISTINCT 그냥 고유 순열을 반환하지 않는 것을 우려하는 경우 왜 시도하지?

    당신이 좋아하지 않아 기존 쿼리에 대해 무엇입니까? 당신이 두 개의 열에서 DISTINCT 그냥 고유 순열을 반환하지 않는 것을 우려하는 경우 왜 시도하지?

    오라클에서 예상대로 확실히 작동합니다.

    SQL> select distinct deptno, job from emp
      2  order by deptno, job
      3  /
    
        DEPTNO JOB
    ---------- ---------
            10 CLERK
            10 MANAGER
            10 PRESIDENT
            20 ANALYST
            20 CLERK
            20 MANAGER
            30 CLERK
            30 MANAGER
            30 SALESMAN
    
    9 rows selected.
    
    
    SQL> select count(*) from (
      2  select distinct deptno, job from emp
      3  )
      4  /
    
      COUNT(*)
    ----------
             9
    
    SQL>
    

    편집하다

    나는 분석과 블라인드 골목을 내려 갔다하지만 대답은 음울 명백했다 ...

    SQL> select count(distinct concat(deptno,job)) from emp
      2  /
    
    COUNT(DISTINCTCONCAT(DEPTNO,JOB))
    ---------------------------------
                                    9
    
    SQL>
    

    편집 2

    합치 솔루션 의지 카운트 오류의 위에 제공된 다음 데이터를 감안할 때 :

    col1  col2
    ----  ----
    A     AA
    AA    A
    

    그래서 우리는 분리를 포함하는 ...

    select col1 + '*' + col2 from t23
    /
    

    분명히 선택 구분자 컬럼에 표시되지 않을 수있는 문자의 문자, 또는 설정을해야합니다.

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

    4.열을 연결, 하나의 쿼리로 실행하려면, 다음 연결된 문자열의 인스턴스의 고유 한 카운트를 얻는다.

    열을 연결, 하나의 쿼리로 실행하려면, 다음 연결된 문자열의 인스턴스의 고유 한 카운트를 얻는다.

    SELECT count(DISTINCT concat(DocumentId, DocumentSessionId)) FROM DocumentOutputItems;
    

    다음과 같이 MySQL의에서 당신은 연결 단계없이 같은 일을 할 수 있습니다 :

    SELECT count(DISTINCT DocumentId, DocumentSessionId) FROM DocumentOutputItems;
    

    이 기능은 MySQL의 문서에서 언급 한 :

    http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_count-distinct

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

    5.어떻게 같은 약 :

    어떻게 같은 약 :

    select count(*)
    from
      (select count(*) cnt
       from DocumentOutputItems
       group by DocumentId, DocumentSessionId) t1
    
    

    아마 당신이 비록 이미 같은 작업을 수행하지만 DISTINCT를 피할 수 있습니다.

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

    6.여기에 부속없이 짧은 버전입니다 :

    여기에 부속없이 짧은 버전입니다 :

    SELECT COUNT(DISTINCT DocumentId, DocumentSessionId) FROM DocumentOutputItems
    

    그것은 MySQL의에서 잘 작동, 나는 최적화 프로그램이 하나를 이해하기 쉽게 시간이 있다고 생각합니다.

    편집 : 분명히 나는 ​​MSSQL과 MySQL의 오해 - 미안,하지만 어쩌면 그것은 어쨌든 도움이됩니다.

  7. ==============================

    7.당신은 그냥 할 수 있도록 많은 (? 대부분의) SQL 데이터베이스 값과 같은 튜플로 작업 할 수 있습니다 : SELECT COUNT (DISTINCT (DocumentId, DocumentSessionId))       DocumentOutputItems FROM; 데이터베이스가이 기능을 지원하지 않는 경우, CHECKSUM 또는 다른 스칼라 함수 좋은를 제공 고유성 예를 들어,의 @ oncel-일 Umut - turer의 제안에 따라 시뮬레이션 할 수 있습니다 COUNT (DISTINCT CONCAT (DocumentId, ':', DocumentSessionId)).

    당신은 그냥 할 수 있도록 많은 (? 대부분의) SQL 데이터베이스 값과 같은 튜플로 작업 할 수 있습니다 : SELECT COUNT (DISTINCT (DocumentId, DocumentSessionId))       DocumentOutputItems FROM; 데이터베이스가이 기능을 지원하지 않는 경우, CHECKSUM 또는 다른 스칼라 함수 좋은를 제공 고유성 예를 들어,의 @ oncel-일 Umut - turer의 제안에 따라 시뮬레이션 할 수 있습니다 COUNT (DISTINCT CONCAT (DocumentId, ':', DocumentSessionId)).

    튜플의 관련 사용은 다음과 같은 쿼리 수행 : DocumentOutputItems SELECT * FROM WHERE (DocumentId, DocumentSessionId)의 (( 'A', '1'), ( 'B', '2'));

  8. ==============================

    8.이 쿼리에 아무것도 잘못입니다,하지만 당신은 이런 식으로 할 수있는 :

    이 쿼리에 아무것도 잘못입니다,하지만 당신은 이런 식으로 할 수있는 :

    WITH internalQuery (Amount)
    AS
    (
        SELECT (0)
          FROM DocumentOutputItems
      GROUP BY DocumentId, DocumentSessionId
    )
    SELECT COUNT(*) AS NumberOfDistinctRows
      FROM internalQuery
    
  9. ==============================

    9.내가 프리마 비스타에 쓰고이 일을 희망

    내가 프리마 비스타에 쓰고이 일을 희망

    SELECT COUNT(*) 
    FROM DocumentOutputItems 
    GROUP BY DocumentId, DocumentSessionId
    
  10. ==============================

    10.당신이 "DISTINCT"을 하나 개의 필드가 있다면, 당신은 사용할 수 있습니다 :

    당신이 "DISTINCT"을 하나 개의 필드가 있다면, 당신은 사용할 수 있습니다 :

    SELECT COUNT(DISTINCT DocumentId) 
    FROM DocumentOutputItems
    

    그것은 SET SHOWPLAN_ALL ON 테스트로, 원본과 동일한 쿼리 계획을 반환한다. 그러나 당신은 미친 듯이 무언가를 시도 할 수 있도록 두 개의 필드를 사용하고 있습니다 :

        SELECT COUNT(DISTINCT convert(varchar(15),DocumentId)+'|~|'+convert(varchar(15), DocumentSessionId)) 
        FROM DocumentOutputItems
    

    널 (NULL)이 참여하는 경우 그러나 당신은 문제가있을 수 있습니다. 난 그냥 원래 쿼리와 함께 다루고 싶어요.

  11. ==============================

    11.나는 발견이 내가 봤 내 자신의 문제에 대한 발견 할 때 다른 오브젝트를 계산하는 경우, 당신은 반환 정확한 수를 (내가 MySQL을 사용하고 있습니다) 얻을

    나는 발견이 내가 봤 내 자신의 문제에 대한 발견 할 때 다른 오브젝트를 계산하는 경우, 당신은 반환 정확한 수를 (내가 MySQL을 사용하고 있습니다) 얻을

    SELECT COUNT(DISTINCT DocumentID) AS Count1, 
      COUNT(DISTINCT DocumentSessionId) AS Count2
      FROM DocumentOutputItems
    
  12. ==============================

    12.나는이 방법을 사용하고 나를 위해 일했다.

    나는이 방법을 사용하고 나를 위해 일했다.

    SELECT COUNT(DISTINCT DocumentID || DocumentSessionId) 
    FROM  DocumentOutputItems
    

    내 경우, 그것은 올바른 결과를 제공합니다.

  13. ==============================

    13.나는 MS SQL도 COUNT 같은 (DISTINCT A, B)를 할 수 있으면 좋겠다. 그러나 그것은 할 수 없습니다.

    나는 MS SQL도 COUNT 같은 (DISTINCT A, B)를 할 수 있으면 좋겠다. 그러나 그것은 할 수 없습니다.

    몇 가지 테스트 CHECKSUM ()가 고유 값을 작성하는 데 실패 후 나에 대한 해결책처럼 보였다 처음 JayTee의 대답에 BU. 빠른 예는 모두 CHECKSUM (31,467,519) 및 CHECKSUM (69,1120,823)가 55 인 동일한 답을 제공한다.

    그럼 몇 가지 조사를했고 마이크로 소프트가 변경 감지 목적으로 CHECKSUM 사용을 권장하지 않는 것을 발견했다. 일부 포럼에서 일부 사용 제안

    SELECT COUNT(DISTINCT CHECKSUM(value1, value2, ..., valueN) + CHECKSUM(valueN, value(N-1), ..., value1))
    

    그러나 이것은 또한 기운이 없습니다.

    TSQL CHECKSUM 수수께끼에 제안 당신은 HASHBYTES () 함수를 사용할 수 있습니다. 그러나 이것은 또한 독특한 결과를 반환하지 않는 작은 기회가있다.

    내가 사용하는 것이 좋습니다 것입니다

    SELECT COUNT(DISTINCT CAST(DocumentId AS VARCHAR)+'-'+CAST(DocumentSessionId AS VARCHAR)) FROM DocumentOutputItems
    
  14. ==============================

    14.이건 어때요,

    이건 어때요,

    Select DocumentId, DocumentSessionId, count(*) as c 
    from DocumentOutputItems 
    group by DocumentId, DocumentSessionId;
    

    이것은 우리에게 문서 ID의 가능한 모든 조합의 수를 얻고, 문서 세션 ID 것이다

  15. ==============================

    15.그것은 나를 위해 작동합니다. 오라클 :

    그것은 나를 위해 작동합니다. 오라클 :

    SELECT SUM(DECODE(COUNT(*),1,1,1))
    FROM DocumentOutputItems GROUP BY DocumentId, DocumentSessionId;
    

    JPQL에서 :

    SELECT SUM(CASE WHEN COUNT(i)=1 THEN 1 ELSE 1 END)
    FROM DocumentOutputItems i GROUP BY i.DocumentId, i.DocumentSessionId;
    
  16. ==============================

    16.나는 비슷한 질문을했지만, 내가 가진 쿼리는 메인 쿼리의 비교 데이터와 하위 쿼리이었다. 뭔가 같은 :

    나는 비슷한 질문을했지만, 내가 가진 쿼리는 메인 쿼리의 비교 데이터와 하위 쿼리이었다. 뭔가 같은 :

    Select code, id, title, name 
    (select count(distinct col1) from mytable where code = a.code and length(title) >0)
    from mytable a
    group by code, id, title, name
    --needs distinct over col2 as well as col1
    

    이것의 복잡성을 무시하고, 나는 원래의 질문에 설명 된 이중 서브 쿼리 서브 쿼리에 a.code의 값을 가져올 수 없습니다 실현

    Select count(1) from (select distinct col1, col2 from mytable where code = a.code...)
    --this doesn't work because the sub-query doesn't know what "a" is
    

    그래서 결국 나는 속임수, 그리고 열을 결합 할 수 있습니다 알아 냈 :

    Select count(distinct(col1 || col2)) from mytable where code = a.code...
    

    이 작업 결국 무엇인가

  17. ==============================

    17.당신은 고정 된 길이의 데이터 유형과 함께 작업하는 경우, 당신은 매우 쉽고 매우 신속하게이 일을 바이너리로 캐스팅 할 수 있습니다. 가정 DocumentId 및 DocumentSessionId 모두의 int, 그리고 4 바이트 길이 그러므로 있습니다 ...

    당신은 고정 된 길이의 데이터 유형과 함께 작업하는 경우, 당신은 매우 쉽고 매우 신속하게이 일을 바이너리로 캐스팅 할 수 있습니다. 가정 DocumentId 및 DocumentSessionId 모두의 int, 그리고 4 바이트 길이 그러므로 있습니다 ...

    SELECT COUNT(DISTINCT CAST(DocumentId as binary(4)) + CAST(DocumentSessionId as binary(4)))
    FROM DocumentOutputItems
    

    내 특정 문제는 다른 외래 키에 의해 그룹화 때때로 특정 값 또는 키에 의해 필터링, 다양한 외부 키의 독특한 조합 및 날짜 필드의 COUNT하여 SUM을 나누는 날이 필요합니다. 테이블은 매우 큰이며, 하위 쿼리를 사용하여 극적으로 쿼리 시간을 증가. 그리고 인해 복잡성, 통계는 단순히 실행 가능한 옵션이 아니다. 체크섬 솔루션은 특히 다양한 데이터 유형의 결과로, 그 변환에 너무 느린도 있었고, 나는 그것의 신뢰성 위험을 감수 할 수 없었다.

    그러나 사실상 질의 시간 (단순히 SUM을 사용하여 비교) 증가했다 위의 솔루션을 사용하지 않고, 완전히 신뢰할 수 있어야! 내가 여기를 게시하도록하겠습니다 때문에 비슷한 상황에서 다른 사람을 도울 수 있어야합니다.

  18. ==============================

    18.이 코드는 두 파라미터에 고유 사용하고 그 고유 값의 로우 카운트의 특정 행의 수의 카운트를 제공한다. 그것은 마법처럼 MySQL의에서 날 위해 일했습니다.

    이 코드는 두 파라미터에 고유 사용하고 그 고유 값의 로우 카운트의 특정 행의 수의 카운트를 제공한다. 그것은 마법처럼 MySQL의에서 날 위해 일했습니다.

    select DISTINCT DocumentId as i,  DocumentSessionId as s , count(*) 
    from DocumentOutputItems   
    group by i ,s;
    
  19. ==============================

    19.당신은 두 번 카운트 기능을 사용할 수 있습니다.

    당신은 두 번 카운트 기능을 사용할 수 있습니다.

    이 경우는 다음과 같습니다

    SELECT COUNT (DISTINCT DocumentId), COUNT (DISTINCT DocumentSessionId) 
    FROM DocumentOutputItems
    
  20. from https://stackoverflow.com/questions/1471250/counting-distinct-over-multiple-columns by cc-by-sa and MIT license