programing

여러 열에 걸쳐 DISTINCT 카운트

bestprogram 2023. 4. 7. 22:01

여러 열에 걸쳐 DISTINCT 카운트

다음과 같은 쿼리를 수행하는 더 나은 방법이 있습니까?

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

이 표에서 구별되는 항목의 수를 세어야 하는데 구별되는 항목이 두 열 이상입니다.

쿼리는 정상적으로 동작하지만 (서브쿼리를 사용하지 않고) 하나의 쿼리로 최종 결과를 얻을 수 있는지 궁금합니다.

성능을 향상시키려면 두 열의 해시 또는 연결된 값에 영구 계산 열을 생성해 보십시오.

열이 계속 유지되고 "sane" 데이터베이스 설정을 사용하는 경우 열을 인덱싱하거나 통계를 작성할 수 있습니다.

계산 컬럼의 개수가 당신의 쿼리와 동일하다고 생각합니다.

편집: 신뢰성이 낮은 체크섬 전용 쿼리에서 변경된 이 작업을 SQL Server 2005에서 수행할 수 있는 방법을 찾았습니다.필요한 만큼 열을 사용할 수 있습니다(체크섬() 함수에 추가).REVERSE() 함수는 int를 varchar로 변환하여 고유 값을 보다 신뢰할 수 있도록 합니다.

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

기존 쿼리의 어떤 점이 마음에 안 드십니까?, 「 」가 되고 있는 .DISTINCT두 열에 걸쳐 고유한 순열만 반환되지 않습니다.

Oracle에서 예상한 대로 작동합니다.

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
/

선택한 구분 기호는 문자 또는 문자 집합이어야 하며, 어느 열에도 표시할 수 없습니다.

단일 쿼리로 실행하려면 열을 연결한 다음 연결된 문자열의 인스턴스 수를 가져옵니다.

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

예를 들어 다음과 같습니다.

select count (카운트 선택)부터(count 선택) cnt문서에서출력 항목그룹화(DocumentId, DocumentSessionId) t1

아마 당신이 이미 알고 있는 것과 똑같을 것이지만, DISTINT를 회피할 것입니다.

일부 SQL 데이터베이스는 태플식으로 작동할 수 있으므로 다음과 같은 작업을 수행할 수 있습니다.

SELECT COUNT(DISTINCT (DocumentId, DocumentSessionId))
      FROM DocumentOutputItems;

중인 가 이를 하지 않는 기타 @ 수 를 들어, CHECSUM은 다음과 같습니다.COUNT(DISTINCT CONCAT(DocumentId, ':', DocumentSessionId)).

MySQL은 특히 비 SQL 표준 구문을 지원합니다.또, 다음과 같이 기술되어 있습니다.In standard SQL, you would have to do a concatenation of all expressions inside COUNT(DISTINCT ...).

은 련련튜inginginginginginginginging를 수행하는 입니다.IN다음과 같이 합니다.

SELECT * FROM DocumentOutputItems
WHERE (DocumentId, DocumentSessionId) in (('a', '1'), ('b', '2'));

서브셀렉트가 없는 단축버전을 다음에 나타냅니다.

SELECT COUNT(DISTINCT DocumentId, DocumentSessionId) FROM DocumentOutputItems

MySQL에서는 정상적으로 동작하고 있기 때문에 옵티마이저가 이해하기 쉬울 것 같습니다.

편집: MSSQL과 MySQL을 잘못 읽은 것 같습니다.죄송합니다만, 어쨌든 도움이 될 것 같습니다.

나는 이 접근법을 사용해왔고 나에게도 효과가 있었다.

SELECT COUNT(DISTINCT DocumentID || DocumentSessionId) 
FROM  DocumentOutputItems

제 경우, 그것은 정확한 결과를 제공합니다.

고정 길이의 데이터 타입을 사용하는 경우 다음 주소로 캐스트할 수 있습니다.binary이데올로기 때문에DocumentId ★★★★★★★★★★★★★★★★★」DocumentSessionId 다이다int길이...s)는 4바이트입니다.

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

가 특별히 요.SUM COUNT다양한 외부 키와 날짜 필드의 고유한 조합을 사용하여 다른 외부 키로 그룹화하거나 특정 값 또는 키로 필터링할 수 있습니다.테이블이 매우 크고 하위 쿼리를 사용하면 쿼리 시간이 크게 늘어납니다.그리고 그 복잡성 때문에 통계는 실행 가능한 선택이 아니었다.CHECKSUM특히 다양한 데이터 유형으로 인해 변환 속도가 너무 느렸고, 그 신뢰성에 대한 위험을 감수할 수 없었습니다.

위의 을 사용하면 했을 때와 하면).SUM신뢰성이 매우 높아야 합니다.비슷한 상황에 있는 사람들에게 도움이 될 수 있을 것 같아서 여기에 올립니다.

질문에는 문제가 없지만 다음과 같은 방법으로 문의할 수도 있습니다.

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

"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이 관련되어 있으면 문제가 발생합니다.난 원래 질문만 고수할 거야.

내가 프리마 비스타에 쓰는게 효과가 있길 바래

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

MS SQL도 COUNT(DISTINCT A, B) 같은 것을 할 수 있으면 좋겠습니다.하지만 그럴 수 없어요.

JayTee의 답변은 몇 가지 테스트에서 고유한 값을 생성하지 못한 후 처음에는 솔루션처럼 보였습니다.간단한 예로 CHECSUM(31,467,519)과 CHECSUM(69,1120,823) 모두 55라는 동일한 답변을 제공합니다.

그 후 몇 가지 조사를 해보니 Microsoft는 변경 감지 목적으로 CHECSUM을 사용하는 것을 권장하지 않습니다.포럼에 따라서는

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

하지만 이것 또한 혼란스럽지는 않다.

TSQL CHECKSUM CONSDUM에서 제시된 바와 같이 HASHBYTS() 함수를 사용할 수 있습니다.그러나 이 경우 고유한 결과가 반환되지 않을 가능성도 희박합니다.

다음을 사용하는 것이 좋습니다.

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

내 문제를 검색해 보니 DISTINT 개체를 세면 올바른 수가 반환됩니다(MySQL 사용 중).

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

이건 어때?

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

그러면 DocumentId와 DocumentSession의 가능한 모든 조합이 표시됩니다.아이디

저는 좋아요.오라클의 경우:

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;

저도 비슷한 질문을 했지만 제가 가진 질문은 메인 쿼리에 비교 데이터가 포함된 하위 쿼리였습니다. 예를 들어 다음과 같습니다.

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

이게 결국 먹힌 거야

이 쿼리는 (MSQL에서) 여러 열이 있는 고유한 카운트를 찾는 데 도움이 됩니다.

SELECT COUNT(DISTINCT concat_column) AS unique_count
FROM (
  SELECT CONCAT(column1, '|', column2, '|', column3) AS concat_column
  FROM your_table_name_here
) AS subquery;

이 코드는 2개의 파라미터에서 고유하게 사용되며 이러한 고유값의 행 수에 고유한 행 수를 제공합니다.MySQL에서는 마법처럼 작동했어요.

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

카운트 기능을 두 번 사용하면 됩니다.

이 경우 다음과 같습니다.

SELECT COUNT (DISTINCT DocumentId), COUNT (DISTINCT DocumentSessionId) 
FROM DocumentOutputItems

언급URL : https://stackoverflow.com/questions/1471250/counting-distinct-over-multiple-columns