【问题标题】:How can I get the top x% of values in a database table如何获取数据库表中前 x% 的值
【发布时间】:2010-08-13 12:55:52
【问题描述】:

如何获取数据库表中前 x% 的值。

例如,我有一个日志文件,我将它加载到一个 db 表中。我想丢弃运行时间最长的 1% 的请求,因为它们会扭曲数据。

有什么简单的方法吗?

顺便说一句,我正在使用 derby 数据库。

谢谢

【问题讨论】:

  • 按运行时间降序排列,跳过第一个百分比? :)

标签: sql derby


【解决方案1】:

您需要累积百分比还是个人百分比?我不知道使用 Derby 计算累积总数的方法,但我知道 H2 数据库/MySQL 的方法。所以只有我的示例的第一部分适用于 Derby。对于 MySQL,您需要将 CAST(... AS INTEGER) 替换为 CAST(... AS SIGNED INTEGER):

drop table test;
create table test(data int);
create index idx_test_data on test(data desc);
insert into test values(1), (1), (1), (2);
insert into test select data from test;
insert into test select data from test;
insert into test select data from test;
insert into test select data from test;
insert into test select data from test;
insert into test select data from test;
insert into test select data from test;
insert into test select data from test;
insert into test select data from test;
insert into test select data from test;
insert into test select data from test;
insert into test select data from test;
insert into test select data from test;
insert into test values(100), (200), (800);
select sum(data), count(*) from test;

select data, (data * 100. / (select sum(data) from test)) percent
from test where data * 100. / (select sum(data) from test) < 1 order by data desc;

select @acc := 0, @total := sum(data) from test;
create table pa as select data, cast(@acc := @acc + (data * 100. / @total) as integer) percent_acc
from test order by data desc;
select * from pa where percent_acc > 2 limit 10;
drop table pa;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多