返回每200行,加上最后一行

时间:2015-09-25 15:47:57

标签: sql database oracle

我想要返回每200行和最后一行。如果少于200行,则返回最后一行。

如果我的桌子有例如333行,返回行200和行333。

我尝试使用mod(SQN,200)='0',但缺少No.333记录。

谢谢你的帮助。

3 个答案:

答案 0 :(得分:0)

如果你想要“SQN是200的整数倍的每一行,以及最大值为SQN的行”,那么:

select *
from   (select *,
               max(sqn) over () max_sqn
        from   table)
where  mod(sqn,200) = 0
   or  sqn          = max_sqn

如果SQN不是一个顺序整数,但是当你按sqn排序时你想要每第200行等,那么:

select *
from   (select *,
               row_number() over (order by sqn) rownumber,
               count(*) over () row_count
        from   table)
where  mod(rownumber,200) = 0
   or  rownumber          = row_count

答案 1 :(得分:0)

oracle中有一个函数可以知道rowid rownum。特别是如果SQN不连续。

我创建了一个cte来添加newID

<强> SQL Fiddle Demo

WITH maxN as (
    Select count(*) as N 
    from Employee
),
rowmod as (
    SELECT "Name", "id", rownum as newID
    FROM Employee 
)
SELECT *
FROM rowmod, maxN
WHERE mod(newID, 21) = 0
   or newID = N

<强>输出

|     Name | id | NEWID |   N |
|----------|----|-------|-----|
|  Jocelyn | 89 |    21 | 100 |
|    Quail |  8 |    42 | 100 |
| Theodore | 28 |    63 | 100 |
|  Shelley | 90 |    84 | 100 |
|    Malik | 49 |   100 | 100 |

答案 2 :(得分:-1)

这是一个非常棘手的问题 - 您需要使用逻辑OR。

SELECT * 
FROM (
  SELECT *, MAX(SQN) as SQNmax
  FROM TABLE
)
WHERE MOD(SQN,200) = 0 OR SQN = SQNmax

如果max(sqn)不起作用,您可以这样做:

SELECT * 
FROM TABLE
JOIN (SELECT MAX(SQN) as SQNmax FROM TABLE) sub
WHERE MOD(SQN,200) = 0 OR SQN = sub.SQNmax