2010-03-22 2 views
0

나쁜 제목 죄송합니다, 내 문제를 설명하는 방법을 모르겠습니다. 항목 ID에 의해T-SQL : GROUP BY를 사용하고 60 %를 초과하는 값을 얻는 방법은 무엇입니까?

| ItemID | Date | 
    ------------------------- 
    | 1  | 01.01.10 | 
    | 1  | 03.01.10 | 
    | 1  | 05.01.10 | 
    | 1  | 06.01.10 | 
    | 1  | 10.01.10 | 
    | 2  | 05.01.10 | 
    | 2  | 10.01.10 | 
    | 2  | 20.01.10 | 

지금 내가 원하는 GROUP과 날짜는 내가 60 %를 과잉 값을 가져올 지 :

나는 다음과 같은 테이블이 있습니다. 제가 말하고자하는 것은 항목 1의 경우 5 개의 행을 가지고 있으므로 각각 20 %의 비율을 가지며 항목 2의 경우 3 개의 행을 갖기 때문에 각각 33,33 %의 비율을 갖습니다. 따라서 항목 1의 경우 3이 필요하고 항목 2의 경우 2의 값이 필요하므로 결과가 그렇게 보입니다.

| ItemID | Date | 
    ------------------------- 
    | 1  | 06.01.10 | 
    | 2  | 10.01.10 | 

이 데이터를 얻을 수있는 쉬운 방법이 있습니까? 아마 OVER를 사용했을까요?

당신에게 의 Torben 내가 뭔가를 하나의 테이블 스캔과 writter를 할 수 있습니다 확신하지만 그것을해야

+0

질문이 명확하지 않습니다. 각 그룹의 60 번째 백분위 수에서 가장 낮은 값을 원한다고 말하는가? –

답변

0
with NumItems as 
(select itemID, count(*) as numOfItems from table group by itemID) 
), 
rowNums as 
( 
select itemID,Date, row_number() over (partition by ItemID order by date asc) as rowNum 
from table 
) 
select itemID, min(Date) from 
rowNums a inner join NumItems b on a.itemID = b.ItemID 
where cast(b.rowNum as float)/cast(numOfItems as float) >= 0.6 
group by itemID 

감사드립니다. 그것은 좋은 일을해야합니다.

+0

NumItems cte를 삭제하고 하나의 테이블 스캔을 방지하기 위해 rowNum/max (rowNum)> 0.6 (물론 캐스트 포함)과 같은 공식을 사용할 수 있습니다. – luckyluke

+0

감사합니다. NumItems를 삭제하고 RowNums에 Num (숫자) 이상의 COUNT (*) OVER (ItemID에 의한 분할)를 사용합니다. – Torben

0

제공된 스크립트에 몇 가지 오류가 있습니다. 다음은 작동하는 것입니다 :

with NumItems as 
( 
    select itemID, count(*) as numOfItems from table group by itemID 
), 
rowNums as 
( 
    select itemID, Date, row_number() over (partition by ItemID order by date asc) as rowNum 
    from table 
) 
select a.itemID, min(a.Date) from 
rowNums a inner join NumItems b on a.itemID = b.ItemID 
where cast(a.rowNum as float)/cast(numOfItems as float) >= 0.6 
group by a.itemID 
관련 문제