我想要返回每200行和最后一行。如果少于200行,则返回最后一行。
如果我的桌子有例如333行,返回行200和行333。
我尝试使用mod(SQN,200)='0'
,但缺少No.333记录。
谢谢你的帮助。
答案 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