2016-06-07 63 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

相关问题