标签: analytic-functions

Oracle Analytic函数用于分组中的最小值

我是处理分析函数的新手.

DEPT EMP   SALARY
---- ----- ------
  10 MARY  100000
  10 JOHN  200000
  10 SCOTT 300000
  20 BOB   100000
  20 BETTY 200000
  30 ALAN  100000
  30 TOM   200000
  30 JEFF  300000

我希望部门和员工的薪水最低.

结果应如下所示:

DEPT EMP   SALARY
---- ----- ------
  10 MARY  100000
  20 BOB   100000
  30 ALAN  100000

编辑:这是我的SQL(当然,它不起作用,因为它也希望group by子句中的人员):

SELECT dept, 
  emp,
  MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY salary)
FROM mytable
GROUP BY dept

sql oracle analytic-functions top-n

7
推荐指数
2
解决办法
2万
查看次数

如何为每个组选择固定数量的行?

这是mysql表中的一些示例数据

a   b   distance
15  44  250
94  31  250
30  41  250
6   1   250
95  18  250
72  84  500
14  23  500
55  24  500
95  8   500
59  25  500
40  73  500
65  85  500
32  50  500
31  39  500
22  25  500
37  11  750
98  39  750
15  57  750
9   22  750
14  44  750
69  22  750
62  50  750
89  35  750
67  65  750
74  37  750
52 …
Run Code Online (Sandbox Code Playgroud)

mysql sql analytic-functions

7
推荐指数
1
解决办法
1806
查看次数

使用结果集系列中的最新非NULL值替换NULL值(SQL Server 2008 R2)

对于SQL Server 2008 R2

我有一个看起来像这样的结果集(注意[price]是数字,下面的NULL表示一个NULL值,结果集按product_id和timestamp排序)

product timestamp          price 
------- ----------------   -----
   5678 2008-01-01 12:00   12.34
   5678 2008-01-01 12:01    NULL
   5678 2008-01-01 12:02    NULL
   5678 2008-01-01 12:03   23.45
   5678 2008-01-01 12:04    NULL
Run Code Online (Sandbox Code Playgroud)

我想将其转换为(基本上)从最新的前一行复制非空值的结果集,以生成如下所示的结果集:

product timestamp          price  
------- ----------------   -----
   5678 2008-01-01 12:00   12.34
   5678 2008-01-01 12:01   12.34
   5678 2008-01-01 12:02   12.34
   5678 2008-01-01 12:03   23.45
   5678 2008-01-01 12:04   23.45
Run Code Online (Sandbox Code Playgroud)

我没有找到允许我这样做的聚合/窗口函数(再次这只是SQL Server 2008 R2所需要的.)

我希望找到一个分析聚合函数来为我做这个,比如......

LAST_VALUE(price) OVER (PARTITION BY product_id ORDER BY timestamp)
Run Code Online (Sandbox Code Playgroud)

但我似乎没有找到任何方法在窗口中执行"累积最新的非空值"(将窗口绑定到前面的行,而不是整个分区)

除了创建一个表值用户定义的函数之外,是否有任何内置函数可以实现此目的?


更新:

显然,此功能在"Denali"CTP中可用,但在SQL Server 2008 R2中不可用.

LAST_VALUE http://msdn.microsoft.com/en-us/library/hh231517%28v=SQL.110%29.aspx …

sql-server aggregate-functions analytic-functions sql-server-2008-r2

7
推荐指数
2
解决办法
1万
查看次数

NoSQL具有分析功能

我正在寻找NoSQL支持分析功能(AF简称)的任何系统(最好是开源),如Oracle/SQL Server/Postgres.我没有找到任何内置函数.我已经阅读了一些内容,Hive但它没有AF(windows,first_last值,ntiles,lag,lead等)的实际特征,只是直方图和ngrams.还有一些NoSQL系统(Redis例如)支持map/reduce,但我不确定是否AF可以用它替换它.

我想进行性能比较,选择Postgres或NoSQL系统.

简而言之:

  1. 正在搜索NoSQL系统AF
  2. 我可以依靠map/reduce来替换AF吗?它快速,可靠,易于使用.

PS.我试图让我的问题更有建设性.

mapreduce analytic-functions nosql

7
推荐指数
1
解决办法
834
查看次数

在oracle查询中计算运行余额

我有这样的数据

id    cp_id   amount_a       amount_b
CCP1  TTP01   10.000.000     2.000.000
CCP1  TTP02   10.000.000     3.000.000
CCP1  TTP03   10.000.000     1.000.000
CCP1  TTP04   10.000.000       500.000
CCP2  TTP05    5.000.000     1.000.000
CCP2  TTP06    5.000.000     2.000.000
CCP3  TTP07    1.000.000       500.000 
Run Code Online (Sandbox Code Playgroud)

我希望结果数据添加一列running_balance,如下所示

id       amount_a       amount_b      running_balance
CCP1   10.000.000     2.000.000     8.000.000
CCP1   10.000.000     3.000.000     5.000.000
CCP1   10.000.000     1.000.000     4.000.000
CCP1   10.000.000       500.000     3.500.000
CCP2    5.000.000     1.000.000     4.000.000
CCP2    5.000.000     2.000.000     2.000.000
CCP3    1.000.000       500.000       500.000 
Run Code Online (Sandbox Code Playgroud)

我已经做了这样的查询

/* Formatted on 1/26/2017 2:50:06 PM (QP5 v5.115.810.9015) */
  SELECT   B.NO_KLAIM AS id, …
Run Code Online (Sandbox Code Playgroud)

oracle analytic-functions

7
推荐指数
1
解决办法
977
查看次数

有趣的Oracle分析查询挑战

我对Oracle分析功能非常熟悉,但这个让我很难过.如果有一个明显的解决方案,我会踢自己:)

我有一个表,JOURNAL,它在另一个表上记录插入,更新和删除.

它是日记的表是BOND_PAYMENTS,它代表PAYMENTS和BONDS之间的链接; 它存储从特定付款(由PAYMENT_ID标识)分配给特定债券(由BOND_NUMBER标识)的金额(AMOUNT).此外,它还记录了分配给(BOP_DOMAIN)的债券的哪个方面,可能是"BON","PET"或其他一些代码.BOND_PAYMENTS表具有代理键(BOP_ID).

因此,对于每个BOP_ID,我的日志表通常会有一个或多个记录 - 首先是INSert,后面可能是一些UPD,后面可能是一个DELete.

这是JOURNAL表:

CREATE TABLE JOURNAL
( JN_DATE_TIME  DATE         NOT NULL,
  JN_OPERATION  VARCHAR2(3)  NOT NULL,
  BOP_ID        NUMBER(9)    NOT NULL,
  PAYMENT_ID    NUMBER(9)    NOT NULL,
  BOND_NUMBER   VARCHAR2(20) NOT NULL,
  BOP_DOMAIN    VARCHAR2(10) NOT NULL,
  AMOUNT        NUMBER(14,2) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

以下是一些示例数据:

INSERT INTO JOURNAL VALUES (TO_DATE('01/01/2010','DD/MM/YYYY'),'INS',1242043,1003700,'9995/10','BON',1800);
INSERT INTO JOURNAL VALUES (TO_DATE('03/01/2010','DD/MM/YYYY'),'INS',1242046,1003700,'9998/10','BON',1700);
INSERT INTO JOURNAL VALUES (TO_DATE('04/01/2010','DD/MM/YYYY'),'INS',1242048,1003700,'9999/10','BON',1800);
INSERT INTO JOURNAL VALUES (TO_DATE('05/01/2010','DD/MM/YYYY'),'INS',1242052,1003700,'10003/10','BON',1600);
INSERT INTO JOURNAL VALUES (TO_DATE('08/01/2010','DD/MM/YYYY'),'INS',1242058,1003700,'9998/10','BON',100);
INSERT INTO JOURNAL VALUES (TO_DATE('09/01/2010','DD/MM/YYYY'),'UPD',1242058,1003700,'9998/10','PET',100);
INSERT INTO JOURNAL VALUES (TO_DATE('01/01/2010','DD/MM/YYYY'),'INS',2242043,1003701,'8995/10','BON',1800);
INSERT INTO JOURNAL …
Run Code Online (Sandbox Code Playgroud)

oracle analytic-functions oracle11gr2

6
推荐指数
1
解决办法
848
查看次数

Oracle Analytic Rolling Percentile

是否可以使用任何百分位函数的窗口?或者你知道一个可以获得滚动百分位值的工作吗?

移动平均线很容易:

select avg(foo) over (order by foo_date rows 
                      between 20 preceding and 1 preceding) foo_avg_ma
from foo_tab
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何在同一个窗口获得中位数(50%百分位数).

oracle analytic-functions oracle11g

6
推荐指数
1
解决办法
4187
查看次数

创建自定义的多参数Oracle分析函数

背景

我知道在Oracle中,可以创建自定义聚合函数来处理值集合并返回单个结果.编辑:我甚至阅读了docs.oracle.com/cd/B28359_01/appdev.111/b28425/aggr_functions.htm上的友好手册!

我还知道Oracle提供了类似和的内置分析函数,它们为每个输入提供相对于输入值的集合/窗口的值.DENSE_RANKRATIO_TO_REPORT

问题

我想知道的是,是否有一种方法可以创建我自己的分析函数,可能与我可以创建自己的聚合函数的方式相似,特别是在我的自定义分析函数中创建一个带有附加参数的函数.

微妙的术语警告

当我提到"分析函数"时,请将其读作一个函数,除了通过PARTITION关键字接受窗口参数外,还可以在给定窗口内返回不同的值.(如果有人有更好的术语,请告诉我!纯粹的分析功能?DENSE_RANK- 分析功能?非聚合分析功能?)

Oracle文档指出聚合函数可以用作分析(窗口)函数.不幸的是,这仅意味着PARTITION用于在分析函数中指定窗口的关键字也可以应用于聚合函数.它不会将聚合函数提升到我能够在固定窗口内返回不同值的令人垂涎的状态.

聚合用作分析:

SELECT SUM(income) OVER (PARTITION BY first_initial) AS total FROM data;
Run Code Online (Sandbox Code Playgroud)

将拥有尽可能多的记录data,但它只有与total第一个首字母一样多的不同s.

分析用作分析:

SELECT RATIO_TO_REPORT(income) OVER (PARTITION BY first_initial) AS ratio FROM data;
Run Code Online (Sandbox Code Playgroud)

将拥有尽可能多的记录data,即使在给定的first_initial分区内,这些记录ratio也可能是不同的.

上下文

我已经提供了对PL/SQL过程的只调用访问,该过程接受数字集合作为IN OUT参数,并且具有一些其他IN配置参数.该过程以受配置参数影响的方式修改集合的值(将其视为"大学专有制裁和所需等级弯曲程序").

目前,使用该过程的过程是硬编码检测从一个数据分区到另一个数据分区的变化的游标循环,然后在每个分区内将数据提取到一个集合中,然后将该集合传递给过程,更改并最终转出进入一个单独的表.我计划通过创建一个PIPELINED PARALLEL_ENABLE封装了一些逻辑的表函数来改进这个,但我更喜欢启用如下的查询:

SELECT G.Course_ID
     , G.Student_ID
     , G.Raw_Grade
     , analytic_wrapper(G.raw_grade, P.course_config_data) …
Run Code Online (Sandbox Code Playgroud)

oracle customization plsql analytic-functions oracle11g

6
推荐指数
1
解决办法
1909
查看次数

在MySQL表中显示单个排名

我有一个名为'highscores'的表,看起来像这样.

id      udid       name       score
1       1111       Mike       200
2       3333       Joe        300
3       4444       Billy      50
4       0000       Loser      10
5       DDDD       Face       400
Run Code Online (Sandbox Code Playgroud)

给定一个特定的udid,我想按其得分值返回该行的等级.

即如果udid给定= 0000,我应该返回5.

知道如何为MySQL数据库编写此查询吗?

mysql sql ranking analytic-functions rank

5
推荐指数
1
解决办法
1767
查看次数

具有 Oracle 分析窗口功能的 Hibernate Criteria

试图覆盖 Oracle10gDialect 并添加 over 和 partition 函数。我在hibernate.org 上阅读了有关如何覆盖方言的信息。我正在使用 Hibernate 4.1.7.Final 并且无法升级。我按照规定实现了它,但是我收到了这个错误。

     15:21:21,353  WARN SqlExceptionHelper:143 - SQL Error: 907, SQLState: 42000
[10/8/13 15:21:21:354 CDT] 00000021 SystemOut     O ORA-00907: missing right parenthesis

[10/8/13 15:21:21:354 CDT] 00000021 SystemOut     O 15:21:21,354 ERROR SqlExceptionHelper:144 - ORA-00907: missing right parenthesis
Run Code Online (Sandbox Code Playgroud)

这是我构建的类:

package com.edmann.util;

import org.apache.log4j.Logger;
import org.hibernate.dialect.Oracle10gDialect;
import org.hibernate.dialect.function.StandardSQLFunction;

/**
 * Because i need some analytic functions i am going to extend the
 * oracle10gDialect so i can register my functions i want to …
Run Code Online (Sandbox Code Playgroud)

java hibernate analytic-functions oracle10g hibernate-criteria

5
推荐指数
1
解决办法
3656
查看次数