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