每天表中可能插入很多数据,想取出每天数据总量的一部分数据出来,这样的SQL如何写?
假设:
create table TEMP
(
PK VARCHAR2(10), --Primary Key
COL1 VARCHAR2(8),
COL2 DATE
)
数据:
PK1 COL1 COL2
001 AC 2004-11-10
002 TT 2004-11-10
003 O 2004-11-10
004 A 2004-11-10
.................................................. --这里省略2004-11-10输入的数据
025 WE 2004-11-11
026 QQ 2004-11-11
.................................................. --这里省略2004-11-11输入的数据现假设2004-11-10中有24条数据,2004-11-11中有150条数据,如何根据COL2即根据日期求出每天数据量的10%的数据出来?即结果2004-11-10中应该会查出2条数据,2004-11-11中查出15条数据.
最好能一条select语句搞定。谢谢各路高手。
假设:
create table TEMP
(
PK VARCHAR2(10), --Primary Key
COL1 VARCHAR2(8),
COL2 DATE
)
数据:
PK1 COL1 COL2
001 AC 2004-11-10
002 TT 2004-11-10
003 O 2004-11-10
004 A 2004-11-10
.................................................. --这里省略2004-11-10输入的数据
025 WE 2004-11-11
026 QQ 2004-11-11
.................................................. --这里省略2004-11-11输入的数据现假设2004-11-10中有24条数据,2004-11-11中有150条数据,如何根据COL2即根据日期求出每天数据量的10%的数据出来?即结果2004-11-10中应该会查出2条数据,2004-11-11中查出15条数据.
最好能一条select语句搞定。谢谢各路高手。
解决方案 »
- 动态SQL中引用变量报错ORA-00933
- 请教,如何通过pl/sql将CSV中得数据导入带有clob的表中
- 急急急,求一sql语句,完成批量加入数据(在线等待,解决就加分)
- 急!困惑!如何求得一个存储过程执行情况,比如cpu利用率.
- 连接两个字符串有哪些方法?他们各有什么不同于相同之处?效率如何?
- 关于 cursor 失效得问题
- 请教一个数据库备份的问题
- 用expdp导出的时候如何将 SEQUENCE也导出?
- 分页查询的第一页数据 要做特殊处理吗?
- 请问如何测量有一条记录的长度
- oracle中select是否有与SQLServer top 10 percent相现的功能?
- 导入数据库时,出现验证错误。请帮助我。急!!!
union all
select * from table t where to_char(t.col2)='2004-11-10' rownum<=(select count(*)/10 from table a t.col2=a.col2)
SELECT col2,col1,ROW_NUMBER()
OVER (
PARTITION BY to_char(col2,'yyyy-mm-dd') ORDER BY col2
) ratio FROM temp
) a
WHERE a.ratio <= (select round(count(*)*0.5) tatio from temp b
where to_char(a.col2,'yyyy-mm-dd')=to_char(b.col2,'yyyy-mm-dd')
group by to_char(b.col2,'yyyy-mm-dd'))
/
SELECT col2,col1,ROW_NUMBER()
OVER (
PARTITION BY to_char(col2,'yyyy-mm-dd') ORDER BY col2
) ratio FROM temp
) a
WHERE a.ratio <= (select round(count(*)*0.1) tatio from temp b
where to_char(a.col2,'yyyy-mm-dd')=to_char(b.col2,'yyyy-mm-dd')
group by to_char(b.col2,'yyyy-mm-dd'))
/
下面的语句可以随机按你设定的比例取记录,每次取的记录不同,但都是10%
比例你可以自己改改,比如要20%,知道在哪里改吧?把round(count(*)*0.1)改成round(count(*)*0.2)
就是分别取20%记录。根据你的假设,会分别取出5条记录和30条记录
因为24的20%是4.8,四舍五入就是5了,你也可以改改语句,取出4条也可以的,不要四舍五入即可SELECT * FROM (
SELECT col2,col1,ROW_NUMBER()
OVER (
PARTITION BY to_char(col2,'yyyy-mm-dd') order by trunc(dbms_random.value(0,10))
) ratio FROM temp
) a
WHERE a.ratio <= (select round(count(*)*0.1) ratio from temp b
where to_char(a.col2,'yyyy-mm-dd')=to_char(b.col2,'yyyy-mm-dd')
group by to_char(b.col2,'yyyy-mm-dd'))
/
ATGC的方法能实现,只是再实现处理一下四舍五入的问题,因为如果某天的记录非常少的话,就没有记录select 出来.