2016-06-07 59 views
1

我有一個表爲文件系統中的每個項目存儲一條記錄,其中項目既可以是文件夾,也可以是實際文件。如何限制爲每個組返回的行數

ID | Name  | Date | Parent ID 
----------------------------------- 
0 | someFolder | xxx | NULL 
1 | a.txt  | yyy | 0 
2 | b.txt  | zzz | 0 

所以,如果我有一個是這樣的一個文件夾結構:

mainFolder (ID = 0) 
    folder1 
     a.txt 
     b.txt 
    folder2 
     c.txt 
     d.txt 

而且我想找到所有葉子節點,通過他們在什麼樣的根文件夾「分組」,我用這個查詢:

select id, name, date, connect_by_root name as "Group" from myTable 
where connect_by_isleaf = 1 
start with parentid = 0 
connect by prior id = parentid 

它得到我的東西沿着這條輸出線:

ID | Name | Date | Group 
--------------------------- 
3 | a.txt | xxx | folder1 
4 | b.txt | yyy | folder1 
8 | c.txt | zzz | folder2 
9 | d.txt | xyz | folder2 

我想要做的是限制每個'組'返回的行數。例如,即使這兩個文件夾中有兩個以上的項目,我也只希望每個文件夾的前兩個(按最近的日期)。我將如何做到這一點?

回答

2

所以我正在嘗試使用row_number()分析來爲組中的每個文件分配一個行號。從1開始到X,然後使用where子句將row_number限制爲所需的2個文件...由於row_number在我們可以應用where子句之前必須實現,所以我需要使用子查詢或CTE。

不知道如何很好的CTE和以前用ROW_NUMBER會一起玩一起連接通過......可能需要使用2 CTE的

我懷疑我有語法完美未經測試;但是這個傳達是一個普遍的概念。

第一次嘗試:

With CTE AS (
select id, name, date, connect_by_root name as "Group", 
ROW_NUMBER() over (partition by connect_by_root name order by ID) RN 
from myTable 
where connect_by_isleaf = 1 
start with parentid = 0 
connect by prior id = parentid) 
Select * from cte where RN <= 2 

第二次嘗試:

With CTE AS (
select id, name, date, connect_by_root name as "Group" from myTable 
where connect_by_isleaf = 1 
start with parentid = 0 
connect by prior id = parentid), 

CTE2 as (Select A.*, 
     Row_number() over (partition by Group order by ID) RN from CTE A) 
Select * from cte2 where RN <= 2 
+0

兩個查詢結束了工作,謝謝! (第一個只需要在'RN'之後有'from myTable'移動 – idlackage

+0

糾正過,因此它在RN之後。好,我更喜歡第一個。但是擔心在執行時根名稱可能無法用於分析(操作順序問題) – xQbert

相關問題