2010-03-22 29 views
0

對不起,我不知道如何描述我的問題。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 BY項ID和日期我想要得到的值,其中過火60%。我的意思是,對於第1項,我有五排,所以每個都有20%的比例,第2項我有三排,所以每個都有33.33%的比例。因此,對於項目1,我需要第三個,第二個項目需要第二個值,以便結果看起來像這樣。

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

是否有一個簡單的方法獲取這些數據?也許使用OVER?

謝謝 託本

+0

這個問題還不清楚。你是說你想要每個組別的第60個百分點的最低值? – 2010-03-22 09:32:42

回答

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 

應該這樣做,雖然我確信它可以只用一個表掃描writter。這應該很好,但。

+0

您可以刪除NumItems cte,並使用像rowNum/max(rowNum)> 0.6(當然有演員表)的公式來避免一次表掃描 – luckyluke 2010-03-22 09:34:25

+0

謝謝,那正是我需要的。我放下NumItems並在RowNums中使用COUNT(*)OVER(PARTITION BY ItemID)作爲NumOfItems。 – Torben 2010-03-22 10:26:03

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