SQL Server选择每组大小小于X的TOP N行

时间:2017-03-15 11:21:45

标签: sql-server

我有一张桌子

id |文件名|尺寸|日期|为了

我想为每个日期选择n个小于100Mo的第一个文件(大小) 例如,如果我有:

数据表: -

enter image description here

我想只保留ID 1,2和11。

我已经写了这个,但它只给了我第一个日期组。

SELECT
ID,
filename,
size,
date,
ordre
FROM tableName
WHERE ID IN ( SELECT ID FROM tableName 
              WHERE ID < 
                   (SELECT TOP 1 ID
                    FROM tableName 
                    WHERE size > 100
                    )
             )

2 个答案:

答案 0 :(得分:1)

我对您的问题的理解:对于每个日期,我希望在该日期的第一行超过100Mb之前获取按ID排序的所有行。

如果我的理解是正确的,那么如下:

SELECT t.ID, t.size, t.date, t.ordre
FROM #tmp t
    LEFT JOIN (
        SELECT MIN(ID) AS MinID, [date]
        FROM #tmp 
        WHERE size > 100
        GROUP BY [date]
    ) m ON t.[date] = m.[date]
WHERE t.ID < m.MinID
    OR m.MinID IS NULL -- for when there is no sizes > 100Mb for a date

答案 1 :(得分:0)

这应该有效:

;with x as (
    select *, row_number() over (partition by date order by id) rn
    from tablename
    where size < 100
)
select * from x where rn <= @n