Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle中查找每个组95%的值_Sql_Oracle - Fatal编程技术网

Sql 在Oracle中查找每个组95%的值

Sql 在Oracle中查找每个组95%的值,sql,oracle,Sql,Oracle,我有一个数据表,比如这个表实际上包含数千行 Group Value A 1 B 2 C 4 A 7 A 8 B 3 C 8 A 6 B 8 C 8 我需要从每组中找出95%的价值 例如,如果组A包含1000行,那么我需要返回950行1000*95% 这可能吗?您可以使用,它将结果集拆分为多个存

我有一个数据表,比如这个表实际上包含数千行

Group   Value
A           1
B           2
C           4
A           7
A           8
B           3
C           8
A           6
B           8
C           8
我需要从每组中找出95%的价值

例如,如果组A包含1000行,那么我需要返回950行1000*95%

这可能吗?

您可以使用,它将结果集拆分为多个存储桶-对于95%的情况,将结果集拆分为20个存储桶,并取1-19。下面的查询将按值的升序为每个组提供20个bucket

with ordered_data as (
select a.*, ntile(20) over (partition by g order by v) as n
  from the_data a
       )
select g, v
  from ordered_data
 where n <= 19
如果这里没有明确的order by,那么丢弃的行的5%将是任意的-这对您可能没有关系,在这种情况下,请删除它

如果不希望按组计数,则可以更简单地计算行数,然后将返回的行数限制为计数的百分比:

with ordered_data as (
select a.*, count(*) over () as ct
  from <your_table> a
 order by v
       )
select g, v
  from ordered_data
 where rownum <= 0.95 * ct
尽管如此,在这里向COUNT添加一个partition子句也会产生类似的效果,即您可以使用COUNT*over partition by g

,它将结果集拆分为多个存储桶-对于95%的结果,将其拆分为20个存储桶,并取1-19。下面的查询将按值的升序为每个组提供20个bucket

with ordered_data as (
select a.*, ntile(20) over (partition by g order by v) as n
  from the_data a
       )
select g, v
  from ordered_data
 where n <= 19
如果这里没有明确的order by,那么丢弃的行的5%将是任意的-这对您可能没有关系,在这种情况下,请删除它

如果不希望按组计数,则可以更简单地计算行数,然后将返回的行数限制为计数的百分比:

with ordered_data as (
select a.*, count(*) over () as ct
  from <your_table> a
 order by v
       )
select g, v
  from ordered_data
 where rownum <= 0.95 * ct
尽管如此,在这里向COUNT添加一个partition子句也会产生类似的效果,即您可以使用COUNT*over partition by g

,它将结果集拆分为多个存储桶-对于95%的结果,将其拆分为20个存储桶,并取1-19。下面的查询将按值的升序为每个组提供20个bucket

with ordered_data as (
select a.*, ntile(20) over (partition by g order by v) as n
  from the_data a
       )
select g, v
  from ordered_data
 where n <= 19
如果这里没有明确的order by,那么丢弃的行的5%将是任意的-这对您可能没有关系,在这种情况下,请删除它

如果不希望按组计数,则可以更简单地计算行数,然后将返回的行数限制为计数的百分比:

with ordered_data as (
select a.*, count(*) over () as ct
  from <your_table> a
 order by v
       )
select g, v
  from ordered_data
 where rownum <= 0.95 * ct
尽管如此,在这里向COUNT添加一个partition子句也会产生类似的效果,即您可以使用COUNT*over partition by g

,它将结果集拆分为多个存储桶-对于95%的结果,将其拆分为20个存储桶,并取1-19。下面的查询将按值的升序为每个组提供20个bucket

with ordered_data as (
select a.*, ntile(20) over (partition by g order by v) as n
  from the_data a
       )
select g, v
  from ordered_data
 where n <= 19
如果这里没有明确的order by,那么丢弃的行的5%将是任意的-这对您可能没有关系,在这种情况下,请删除它

如果不希望按组计数,则可以更简单地计算行数,然后将返回的行数限制为计数的百分比:

with ordered_data as (
select a.*, count(*) over () as ct
  from <your_table> a
 order by v
       )
select g, v
  from ordered_data
 where rownum <= 0.95 * ct

尽管如此,在这里向COUNT添加一个partition子句也会产生类似的效果,即COUNT*除以g

+1,听起来就像我想要的那样。我将在我的查询中实现这一点,并让您知道它是有效的。谢谢Ben+1,听起来正是我想要的。我将在我的查询中实现这一点,并让您知道它是有效的。谢谢Ben+1,听起来正是我想要的。我将在我的查询中实现这一点,并让您知道它是有效的。谢谢Ben+1,听起来正是我想要的。我将在我的查询中实现这一点,并让您知道它是有效的。谢谢Ben