【问题标题】:Apply a Substr to a distinct result in oracle将 Substr 应用于 oracle 中的不同结果
【发布时间】:2015-07-10 21:10:16
【问题描述】:

在 Oracle 中,我需要对显示“重复”值(相对于 table1 中的 timeInmillis 列)的连接查询中的列 (timeInmillis) 求平均值。我需要保留连接中的值,但要得到正确的平均值。

我正在尝试做这样的事情:

select AVG(SUBSTR(DISTINCT(concat(id1,timeInMillis)),LENGTH(id1)+1,LENGTH(CONCAT(id1,timeInMillis)))), someColumn, otherColumn 
FROM table1 t1
LEFT JOIN table2 t2  ON t1.id1 = t2.id1 group by somestuff,someotherStuff;

如果我尝试这样做,我会得到:

ORA-00936:缺少表达式

这是一个例子:

表1:

id1 timeInMillis otherColumn
1       5            X
2       15           X

表2:

id2  id1 otherColumn
--------------------
1     1       X
2     1       X
3     2       X 

从我的加入中,我得到一个这样的结果集:

id1 id2 timeInmillis moreColumns
--------------------------------
1    1      5           X
1    2      5           X  
2    3      15          X 

我需要获得 5 和 15 的平均值(具有不同的 id1),但我无法修改 sql 的 where 部分(因为我得到了其他值)

My result should be:

AVG(TIMEINMILLIS)    otherResults
----------------------------------  
10                   'whatever'

提前致谢。

【问题讨论】:

  • DISTINCT 不是列上的函数,它适用于整个选定的行。您能否提供示例数据和预期结果,我们也许会了解您正在尝试做什么。
  • 解释起来有点困难,但我确实编辑了这个问题。
  • 我还是不明白。 “5 和 15 的平均值(具有不同的 id1)”? 15和ID 1有什么关系?为什么还有两个ID?在您的示例查询中,您连接两个表,它们的 ID 匹配;在您的示例数据中,您有具有 不同 ID 的记录。您能否再次编辑您的问题并告诉我们您要做什么?
  • 假设 table1 有 id1 和 timeInMillis,table2 有 id2、id1。我们从连接中得到这样的结果。因此,当 id1 与我的结果集不同时,我需要以毫秒为单位获取平均时间
  • 好吧,我想我越来越近了 :-) 您只想查看 ID1。对于 ID1 = 1,您希望获得 (5,5) 的平均值,即 5。对于 ID 2,您希望获得 15 的平均值,当然是 15。或者你想得到 (5,5,15) 的平均值吗?然后,您希望结果中有多少行?所有三个,每个都在列中显示额外的平均值?还是只有 2 个,一个用于 ID1=1,一个用于 ID1=2?

标签: sql oracle distinct substr


【解决方案1】:

1) 选项

 select  SUBSTR(someColumn,n,m) from ( 
      select DISTINCT someColumn  from MYTABLE
    );

2) 选项

select DISTINCT SUBSTR(someColumn,n,m) from MYTABLE;

*) 查询可以返回不同的结果。

【讨论】:

  • 第一个是好的,但我不能用它来解决我的问题。第二个,不是我想做的……谢谢
【解决方案2】:

您的最后一次编辑终于清楚地说明了您想要什么。您只需要一行,显示 table1 的值的平均值,但当然没有因为加入表 2 而得到的重复项。

一种解决方案是分两步获得最终值:

select avg(distinct_time), sum(sub_sum)
from
(
  select max(timeinmillis) as distinct_time, sum(some_other_colum) as sub_sum
  from (query)
  group by id1
);

另一种解决方案是重写查询。

【讨论】:

  • 问题是,我不能按 id1 分组,因为我定义了其他分组方式子句,我无法更改它们。其他值取决于连接表。我知道这听起来很奇怪,但就是这样。我开始认为我不能以这种方式做我需要的事情......
  • 到目前为止,无论您按什么分组,这都应该在内部查询中。您应该能够用完整的查询替换from(query) 中的query。所以现有的 GROUP BY 子句不碍事。但是,是的,也许您想要在所描述的过程中丢失的聚合。那么重写查询将是您唯一的选择。
【解决方案3】:

您的语法错误。你也可以尝试这样的事情:-

select avg(TimeInMillis), other_cols_as_well
from(SELECT TAB1.id1, TAB2.id2, avg(TimeInMillis) as TimeInMillis
FROM TAB1, TAB2
WHERE TAB1.id1 = TAB2.id1
group by TAB1.id1, TAB2.id2) temp
where temp.id1 <> temp.id2
group by other_cols_as_well

这是小提琴 http://sqlfiddle.com/#!4/1fc017/16

【讨论】:

  • 我知道这是错的,这就是为什么我要问怎么做。你的查询不是我想要做的,我需要做不同的值,然后选择结果集中的一些字符。无论如何谢谢......
  • 再次感谢。您的解决方案实际上适用于 avg 值,但不能解决我的问题。我需要维护内部选择的“分组依据”,而外部选择的值应该显示内部查询的“分组依据”结果,而不仅仅是平均时间。我想如果不完全重写查询就没有办法做我想做的事情......
猜你喜欢
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
相关资源
最近更新 更多