2016-11-30 4 views
4

私は約が必要です。各日付から30%のデータ。私は2016年11月13日
5行の2016年11月12日
2行の2016年11月11日
3列に特定の約から最上位の行を取得する方法。 SQL Server 2008を使用している割合?

10行を持っている。この場合

id  name datecol 
----------------------- 
1  A  2016-11-11 
2  B  2016-11-11 
3  C  2016-11-11 
4  D  2016-11-11 
5  E  2016-11-11 
6  F  2016-11-11 
7  G  2016-11-11 
8  H  2016-11-11 
9  I  2016-11-11 
10  J  2016-11-11 
11  A1 2016-11-12 
12  B1 2016-11-12 
13  C1 2016-11-12 
14  D1 2016-11-13 
15  E1 2016-11-13 
16  F1 2016-11-14 
17  G1 2016-11-14 
18  H1 2016-11-14 
19  I1 2016-11-14 
20  J1 2016-11-14 

2016-11-14の場合

このように必要なのは約です。各日付から上位行の30パーセント、事前に

id  name datecol 
----------------------- 
1  A  2016-11-11 
2  B  2016-11-11 
3  C  2016-11-11 
11  A1 2016-11-12 
14  D1 2016-11-13 
16  F1 2016-11-14 
17  G1 2016-11-14 

感謝。

+0

背後にあるロジックは何ですか?各日付の後ろにn行 – TheGameiswar

+0

ロジックがありません。上または下の行など、n個の行。 –

答えて

5

行番号を取得するにはROW_NUMBER()を使用して、このクエリを試してみて、COUNT() OVER()は、各日付の合計数を取得するには:

WITH CTE AS 
(
    SELECT T.*, 
     ROW_NUMBER() OVER (PARTITION BY datecol ORDER BY Name) as RowNum, 
     COUNT(*) OVER (PARTITION BY datecol) as Total 
    FROM Table as T 
) 
SELECT id,name,datecol 
    FROM CTE 
WHERE RowNum <= CEILING(Total*0.30) 

結果:

1 A 2016-11-11 
2 B 2016-11-11 
3 C 2016-11-11 
11 A1 2016-11-12 
14 D1 2016-11-13 
16 F1 2016-11-14 
17 G1 2016-11-14 
2
;with cte as (
    Select * 
      ,RN=Row_Number() over (Partition By datecol Order By datecol) 
    From YourTable 
) 
Select A.* 
From cte A 
Join (Select datecol,cnt=count(*) from YourTable Group By datecol) B 
    on A.datecol=B.datecol 
    and A.RN<=ceiling(B.cnt*.3) 
Order by datecol,RN 

戻り

id name datecol  RN 
1 A  2016-11-11 1 
2 B  2016-11-11 2 
3 C  2016-11-11 3 
11 A1  2016-11-12 1 
14 D1  2016-11-13 1 
16 F1  2016-11-14 1 
17 G1  2016-11-14 2 
関連する問題