2011-09-06 7 views
1

SQL 문이 필요합니다. 요구 사항은 다음과 같습니다. 두 개의 열 (ID, Owner_ID; 나는 예를 들어, 여러 기록을 삽입 : SQL에서 사용 개수

ID Owner_ID 
0   0 
1   0 
2   1 
3   1 
4   2 
5   3 
6   3 
7   3 
8   3 
9   0 

가 지금은 가장 큰에서 작은에, 다른 사용자가 소유 한 행의 수에 의해 정렬 된 ID 목록을 반환하는 SQL 문을해야합니다. 이 예에서 소유자 3은 네 개의 행을가집니다. 소유자 0은 3 개의 행을 가지며, 소유자 1은 2 개의 행을가집니다. 소유자 2는 한 행을가집니다. 결과는

나는 집계 함수의 계수를 사용한다고 생각
ID Owner_ID 
5   3 
6   3 
7   3 
8   3 
0   0 
1   0 
9   0 
2   1 
3   1 
4   2 

가, 누군가가 아이디어가 않습니다해야 하는가?

저는 HSQLDB를 사용하고 있습니다.

미리 감사드립니다.

+2

어느 DBMS입니까? 표시된 것처럼 순수한 SQL로 결과를 생성하려면 표준 SQL 기능이 아닌 select-list에없는 (계산 된) 열을 ORDER BY 할 수있는 DBMS가 필요합니다. –

답변

4

이것은 대부분의 SQL DBMS에서 작동하지만 카운트 값을 보여줍니다.

SELECT ID, Owner_ID, Owner_Count 
    FROM AnonymousTable AS A 
    JOIN (SELECT Owner_ID, COUNT(*) AS Owner_Count 
      FROM AnonymousTable 
     GROUP BY Owner_ID 
     ) AS B ON B.Owner_ID = A.Owner_ID 
ORDER BY Owner_Count DESC, Owner_ID ASC, ID ASC; 

일부 DBMS에서 작동하지만 반드시 그렇지는 않습니다. 결과 목록에 표시되지 않은 열을 기준으로 주문합니다.

SELECT ID, Owner_ID 
    FROM AnonymousTable AS A 
    JOIN (SELECT Owner_ID, COUNT(*) AS Owner_Count 
      FROM AnonymousTable 
     GROUP BY Owner_ID 
     ) AS B ON B.Owner_ID = A.Owner_ID 
ORDER BY Owner_Count DESC, Owner_ID ASC, ID ASC; 
4

이것은 매우 간단합니다.

SELECT 
    ID, 
    Owner_ID 
FROM 
    TheTable t 
ORDER BY 
    (SELECT COUNT(*) FROM TheTable i WHERE i.Owner_ID = t.Owner_ID) DESC 
+0

또는 아마도 "ORDER BY (SELECT COUNT (*) From TheTable i 어디서 오셨습니까? t.Owner_ID) DESC, Owner_ID, ID"? – Andy

+0

@Andy : 원하는 경우. OP는 그룹 내 정렬을 지정하지 않았지만 쉽게 파악할 수 있어야합니다. :) – Tomalak

3

예, 귀하는 일반적인 아이디어가 있습니다. 다음 쿼리를 사용해보십시오 :

select t.ID, t.Owner_ID 
from table t 
inner join (select Owner_ID, count(*) c from table t group by Owner_ID) tc 
    on t.Owner_ID = tc.Owner_ID 
order by 
    tc.c desc, t.ID asc