Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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 如何使用group by,但仍能巧妙地访问每个数字值_Sql_Oracle_Group By - Fatal编程技术网

Sql 如何使用group by,但仍能巧妙地访问每个数字值

Sql 如何使用group by,但仍能巧妙地访问每个数字值,sql,oracle,group-by,Sql,Oracle,Group By,我需要“分组”我的数据来区分测试(每个测试都有一个特定的id、名称和温度),并计算它们的计数、标准偏差等。但我还需要访问每个组中的每个原始数据值,以便在python脚本中进行进一步的索引计算 我找到了两种解决此问题的方法,但这两种方法似乎都不是最优的/有缺陷的: 1) 使用listagg存储分组到单个字符串行中的每个原始值。它完成了工作,但没有优化:我将多个浮点值连接成一个巨大的字符串,我将立即反连接并转换回浮点。这似乎是必要和昂贵的 2) 完全按移除组,并通过分区进行计数和标准偏差。但这对我来

我需要“分组”我的数据来区分测试(每个测试都有一个特定的id、名称和温度),并计算它们的计数、标准偏差等。但我还需要访问每个组中的每个原始数据值,以便在python脚本中进行进一步的索引计算

我找到了两种解决此问题的方法,但这两种方法似乎都不是最优的/有缺陷的:

1) 使用listagg存储分组到单个字符串行中的每个原始值。它完成了工作,但没有优化:我将多个浮点值连接成一个巨大的字符串,我将立即反连接并转换回浮点。这似乎是必要和昂贵的

2) 完全按移除组,并通过分区进行计数和标准偏差。但这对我来说似乎更糟。我不知道PLSQL/oracle是否对此进行了优化,它可能会为每一行计算相同的计数和标准偏差(我不知道如何检查)。查询结果也变得混乱:因为不再有“groupby”,我必须在python文件中添加多个检查,以区分每个测试数据(特定id、名称和温度)

我认为我的第一个解决方案可以改进,但我不知道如何改进。如何使用group by,但仍能巧妙地访问每个数字值

一个类似于list_agg但使用集合/数组输出类型而不是字符串输出类型的函数可能会起到作用(一种与oracle兼容的“array_agg”),但我不知道有什么

编辑: 示例数据很复杂,可能仅限于公司查看,但我可以向您展示我对my 1)的简化查询:

结果如下:

test_id | test_name  | temperature | all_specific_test_values | n | sigma
-------------------------------------------------------------------------
6001    |VADC_A(...) | -40         | ,8094034194946289 ,8(...)| 58 | 0,54
6001    |VADC_A(...) |  25         | ,5054857852946545 ,6(...)| 56 | 0,24
6001    |VADC_A(...) |  150        | ,8625754277452524 ,4(...)| 56 | 0,26
6002    |VADC_B(...) | -40         | ,9874514651548454 ,5(...)| 57 | 0,44

我认为您需要分析函数:

select t.*,
       count(*) over (partition by test) as cnt,
       avg(value) over (partition by test) as avg_value,
       stddev(value) over (partition by test) as stddev_value
from t;

这会在每行上添加额外的列。

我认为您需要分析函数:

select t.*,
       count(*) over (partition by test) as cnt,
       avg(value) over (partition by test) as avg_value,
       stddev(value) over (partition by test) as stddev_value
from t;

这会在每行上添加额外的列。

我建议使用@Gordon_Linoff的解决方案。这可能是最标准的解决方案

如果您想使用不太标准的解决方案,可以使用
groupby
,将集合作为列之一返回。据推测,您的脚本可以遍历该集合,尽管可能需要在脚本中做一些工作

create type num_tbl as table of number;
/

create table foo (
  grp integer,
  val number
);

insert into foo values( 1, 1.1 );
insert into foo values( 2, 1.2 );
insert into foo values( 1, 1.3 );
insert into foo values( 2, 1.4 );

select grp, avg(val), cast( collect( val ) as num_tbl )
  from foo
 group by grp

我建议使用@Gordon_Linoff的解决方案。这可能是最标准的解决方案

如果您想使用不太标准的解决方案,可以使用
groupby
,将集合作为列之一返回。据推测,您的脚本可以遍历该集合,尽管可能需要在脚本中做一些工作

create type num_tbl as table of number;
/

create table foo (
  grp integer,
  val number
);

insert into foo values( 1, 1.1 );
insert into foo values( 2, 1.2 );
insert into foo values( 1, 1.3 );
insert into foo values( 2, 1.4 );

select grp, avg(val), cast( collect( val ) as num_tbl )
  from foo
 group by grp

请提供示例数据和所需的结果。听起来您可能不想要聚合函数,而是。这些不会像聚合函数那样折叠您的行。请提供示例数据和所需结果。听起来您可能不需要聚合函数,而是需要。这些不会像聚合函数那样折叠您的行。这是我在解决方案2中探讨的问题,我的问题是,这会使我的查询结果混乱(没有更多与特定测试相对应的分组),并且可能不会得到优化:服务器是否会重新计算计数并在每一行中重新划分每一行?@Pierre。Oracle内置了分析功能,并已对其进行了优化。它们通常是完成任务的最快方法。事实上,“解释计划”工具表明,我的担心在没有根据的情况下,计数和标准开发只需要一个“窗口排序”。实际上,总成本甚至略有降低(33504->33502)。但奇怪的是,执行时间几乎翻了一番(7秒->12秒)。。。可能是因为换乘时间?因为现在每个原始_值都有自己的行,需要发送的行数比解决方案1中的要多(但每个行中的数据较少,所以这并不能解释这种差异)@Pierre。返回更多行的DB会有开销。但是,也许按组而不是按行设置值就足够了,您可以使用聚合。这是我在解决方案2中探讨的问题,我的问题是,这会使查询结果变得混乱(没有更多与特定测试相对应的分组)而且可能没有得到优化:服务器是否重新计算计数并重新划分每一行中的每一行?@Pierre。Oracle内置了分析功能,并已对其进行了优化。它们通常是完成任务的最快方法。事实上,“解释计划”工具表明,我的担心在没有根据的情况下,计数和标准开发只需要一个“窗口排序”。实际上,总成本甚至略有降低(33504->33502)。但奇怪的是,执行时间几乎翻了一番(7秒->12秒)。。。可能是因为换乘时间?因为现在每个原始_值都有自己的行,需要发送的行数比解决方案1中的要多(但每个行中的数据较少,所以这并不能解释这种差异)@Pierre。返回更多行的DB会有开销。但是,也许按组而不是按行设置值就足够了,您可以使用聚合。“类似于list_agg的函数,但具有集合/数组输出类型而不是字符串输出类型”。这听起来像是医生要的。为什么你认为这是“不太标准的”?@Matthewmpeak-在结果集中返回集合的情况要少见得多。这意味着,无论您使用什么样的ORM/API来访问数据库,都不太可能有一种健壮的、记录良好的方法来处理结果中的集合。这可能意味着您在网络级别上获得的性能较差--我没有测试过这一点,但我知道,比如说,当我有一个结果集,其中一列是游标时,您会在每一行上执行额外的网络往返,以实际从