여러 열에 걸쳐 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
'programing' 카테고리의 다른 글
SQL Server VARCHAR/NVARCHAR 문자열에 줄 바꿈을 삽입하는 방법 (0) | 2023.04.07 |
---|---|
SQL Server 2008에서 테이블 에일리어스를 사용하여 UPDATE SQL을 작성하는 방법 (0) | 2023.04.07 |
표에서 특정 열의 첫 번째 문자를 삭제하려면 어떻게 해야 합니까? (0) | 2023.04.07 |
두 날짜 사이의 날짜를 선택하는 SQL 쿼리 (0) | 2023.04.07 |
SQL Server 인덱스 - 오름차순 또는 내림차순, 어떤 차이가 있습니까? (0) | 2023.04.07 |