2014-01-09 2 views
0

임의의 12 개의 행을 가져 오는 SQL 쿼리를 확인하십시오.그룹에서 N 개의 임의 행을 선택하십시오.

SELECT TOP 12 ExportSystem.sysID, ExportSystem.sysNo, ExportSystem.sysName, Document.docArchiveNo FROM ExportSystem 
INNER JOIN Customer ON ExportSystem.sysNo = Customer.expSysNr 
INNER JOIN Department ON Customer.cusID = Department.cusID 
INNER JOIN Level ON Level.levParentID = Department.levRootID 
INNER JOIN Document ON Document.levID = Level.levID 
GROUP BY ExportSystem.sysID, ExportSystem.sysNo, ExportSystem.sysName, Document.docArchiveNo 
ORDER BY newid() 

나는 많은 것들을 시도했지만 각 그룹에 대한 행의 같은 번호를 얻는 방법을 파악하지 않은

SystemName ArchiveNo 
RR 31676981 
AA 28741154 
AA 30435868 
AA 29665408 
AA 28116900 
BB 31114199 
RR 29080695 
AA 29903701 
VV 31890130 
BB 29898481 
BB 30892927 
AA 30545346 

결과. 현재 2 개의 RR, 6 개의 AA, 3 개의 BB 및 1 개의 VV가 있습니다. 각 SystemName 그룹에서 4 행을 얻는 방법.

+1

아이디어는 각 그룹에서 4 개의 임의의 행을 따로 따로 선택하고 합집합을 만드는 것입니다. – wxyz

답변

2

당신은 그렇게 할 PARTITION BY Systemname와 순위 기능 ROW_NUMBER를 사용할 수 있습니다

WITH CTE 
AS 
(
    SELECT 
    ExportSystem.sysID, 
    ExportSystem.sysNo, 
    ExportSystem.sysName, 
    Document.docArchiveNo, 
    ROW_NUMBER() OVER(PARTITION BY ExportSystem.sysName 
         ORDER BY newid()) AS RN 
    FROM ExportSystem 
    INNER JOIN Customer ON ExportSystem.sysNo = Customer.expSysNr 
    INNER JOIN Department ON Customer.cusID  = Department.cusID 
    INNER JOIN Level  ON Level.levParentID = Department.levRootID 
    INNER JOIN Document ON Document.levID  = Level.levID 
) 
SELECT 
    sysID, 
    sysNo, 
    sysName, 
    docArchiveNo 
FROM CTE 
WHERE RN <= 4; 

하는 것으로 : 원래 쿼리에서 GROUP BY에서 같은 열을 선택하면 GROUP BY을 사용할 필요가없는, 쓸모 . 그것을 제거하고 대신 DISTINCT을 사용하십시오.

+0

감사합니다. 그것은 작동합니다. – mrd

+0

@mrd - 오신 것을 환영합니다 :) –

관련 문제