2010-06-15 4 views
1

저는 SQL 쿼리에 다소 익숙하며,이 특정 문제로 고민하고 있습니다. 의 나는 다음과 같은 3 개 레코드를 반환 쿼리 (편의상 하나 개의 컬럼으로 유지) 있다고 가정 해 봅시다 :


발생 빈도로 이름 검색

을 그리고 이름별로 그룹화 그 결과를 갖고 싶어하고 또한 부분을 포함 반환 된 총 레코드 중에서 그 이름의 발생 빈도 (비율).

원하는 결과는 (두 열로)
Tom | 2/3
잭 | 1/3

어떻게 처리하나요? 분자를 결정하는 것은 꽤 쉽습니다 (COUNT()와 GROUP BY 이름을 사용할 수는 있습니다).하지만 반환 된 총 행 수 중 비율로 변환하는 데 문제가 있습니다.

은 어떤 도움이 많이 감사합니다!

답변

3
SELECT name, COUNT(name)/(SELECT COUNT(1) FROM names) FROM names GROUP BY name; 
+0

글쎄, "names"부분은 사실 내 자신의 긴 쿼리입니다. 일반 쿼리에서 두 번 표시되도록 전체 하위 쿼리를 복사하여 붙여 넣기해야합니까? 아니면 "SELECT 이름, COUNT (이름)/(SELECT COUNT (1) FROM (SELECT ...) AS my_subquery) FROM my_subquery GROUP BY name;"과 같이 할 수 있습니다. ? 만약 그렇다면, 구문을 올바로 볼 수없는 것 같습니다. –

+0

또한, 당신이 제공 한 쿼리의 구조는 작동하지만, "COUNT (1) AS float"으로 바꾸어야했습니다. 그렇지 않으면 정수 나누기를 수행하고 모두 0을 반환했기 때문입니다. –

1

분모가 고정되어 있으므로 "비율"은 분자에 정비례합니다. 당신이하지 않는 정말은 단지 같은 것을 사용하는 것이 훨씬 쉬울 것이다, 분모를 표시해야합니다

select name, count(*) from your_table_name 
group by name 
order by count(*) desc 

을 당신은 올바른 순서로 올바른 데이터를 얻을 수 있습니다 만, 같이있어 숫자는 것이다 비율 대신 계산해라.

분모가 실제로 필요한 경우 그룹화되지 않은 동일한 선택 항목에서 count(*)을 수행합니다. 그러나 선택 기간에 따라 꽤 느려질 수 있습니다.

+0

글쎄, 순수한 계수 대신 비율을 사용하려는 이유는 데이터에 필터를 사용하고 있기 때문입니다. 즉, 반환 된 레코드의 절반 이상을 차지하는 경우에만 "Tom"을 반환하려고합니다. 그렇지 않으면 나는 그것을 단지 소음으로 본다. 이것에 대해 더 똑똑한 방법이 있습니까? 아마 응용 프로그램 코드에서이 작업을 수행해야합니까? –

+0

@jjiffer : 아마도 대략적인 대답이 유용할까요? 단지 * one * 그룹 만이 레코드의 절반 이상을 구성 할 수 있습니다. 따라서 아마도 최고 레코드 수를 반환 할 수 있습니까? 그것은 반드시 기록의 절반 이상은 아니지만 어쩌면 당신의 목적에 충분히 가깝겠습니까? –

+0

좋은 지적이지만, "설득력있는"대답이 없다면 아무 것도 돌려주지 않을 수도 있습니다. 아마도 약간의 것들을 조정할 것이고 계산 시간과 거친 근사법의 정확성을 비교하고 앞으로 어떤 기술이 나오는지 보겠습니다. 당신의 도움을 주셔서 감사합니다! –