标签: analytic-functions

Oracle Analytics - sql查询的分区和排序

在回答另一个用户的问题(TheSoftwareJedi)时出现了这个问题 ......

鉴于下表:

ROW_PRIORITY   COL1     COL2    COL3
0              0.1      100     <NULL>
12             <NULL>   <NULL>  3
24             0.2      <NULL>  <NULL>
Run Code Online (Sandbox Code Playgroud)

以及以下查询:

select  'B' METRIC, ROW_PRIORITY,
        last_value(col1 ignore nulls) over (ORDER BY ROW_PRIORITY) col1,
        last_value(col2 ignore nulls) over (ORDER BY ROW_PRIORITY) col2,
        last_value(col3 ignore nulls) over (ORDER BY ROW_PRIORITY) col3
from    (SELECT * FROM ZTEST);
Run Code Online (Sandbox Code Playgroud)

我得到这些结果:

METRIC  ROW_PRIORITY    COL1    COL2    COL3
B            0          0.1     100     <NULL>
B           12          0.1     100     3
B           24          0.2     100     3
Run Code Online (Sandbox Code Playgroud)

预期:

METRIC  ROW_PRIORITY …
Run Code Online (Sandbox Code Playgroud)

oracle analytic-functions

3
推荐指数
1
解决办法
1580
查看次数

oracle中的dense_rank()分析函数

SELECT empno, deptno
dense_rank() OVER (PARTITION BY deptno
     ORDER BY sal NULLS LAST) SRLNO
FROM emp
WHERE deptno IN (10, 20)
group by empno, deptno  --,sal
ORDER BY deptno, SRLNO;
Run Code Online (Sandbox Code Playgroud)

此查询不起作用,因为它Sal应该在group by子句中.任何人都可以解释为什么会这样,并且有没有其他选择在不改变group by子句的情况下获得相同选择的排名?你想只根据工资订购排名.

编辑
假设在emp表中有另一个列名commision,我必须通过deptno和commision分组并仅通过deptno进行分区,那么建议的答案是什么:

    SELECT empno, deptno,sum(sal) 
    dense_rank() OVER (PARTITION BY deptno
     ORDER BY sal NULLS LAST) SRLNO
    FROM emp
    WHERE deptno IN (10, 20)
    group by  deptno,commision  --,sal
    ORDER BY deptno, SRLNO;
Run Code Online (Sandbox Code Playgroud)

现在我如何通过depno和commision进行分组,并且只能通过deptno进行分区.

如何在不同的列上进行分组并根据不同列的分区查找排名

sql oracle analytic-functions oracle10g

3
推荐指数
1
解决办法
3361
查看次数

SQL - ROW_NUMBER()OVER(ORDER BY)不起作用

无论我在ORDER BY子句中放置什么,结果集的顺序都不会改变.

WITH Results AS (
    SELECT DISTINCT 
        MessageThreadUsers.threadFK, 
        MessageThreads.threadDate, 
        Messages.MessageBody, 
        Messages.senderFK,
        Users.userFullName AS senderFullName, 
        ROW_NUMBER() OVER (ORDER BY MessageThreads.threadDate DESC) AS RowNumber

    FROM MessageThreadUsers
        JOIN MessageThreads ON MessageThreadUsers.threadFK = MessageThreads.threadID
        JOIN Messages ON MessageThreads.threadDate = Messages.messageDate
        JOIN Users ON Messages.senderFK = Users.userID

    WHERE userFK = 'usr_developer'
) 
SELECT * FROM Results WHERE RowNumber BETWEEN 1 AND 10
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-order-by analytic-functions sql-server-2008

3
推荐指数
1
解决办法
4万
查看次数

Oracle - 在聚合函数中使用分析函数

我有一个像这样的表 DATE_VALUE:

  Date        Value

  ----        -----

01/01/2012    1.5 

02/01/2012    1.7 

03/01/2012    1.3

04/01/2012    2.1

05/01/2012    3.4
Run Code Online (Sandbox Code Playgroud)

我想计算两个连续日期之间的价值差异之间的差异。但是这个简单的查询不起作用:

select variance(lead( value,1) OVER (order by date) - value)
 from DATE_VALUE
Run Code Online (Sandbox Code Playgroud)

我有一个错误:

ORA-30483:此处不允许使用窗口函数 30483。00000 - “此处不允许使用窗口函数” *原因:仅在查询的 SELECT 列表中允许使用窗口函数。并且,窗口函数不能作为另一个窗口或组函数的参数。

如果我将方差函数移出查询,则查询工作正常:

select variance(difvalue) from (
  select lead( value,1) OVER (order by rundate) - value  as difvalue
  from DATE_VALUE 
);
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何方法可以修改查询,以便不使用子查询?

sql oracle aggregate-functions analytic-functions

3
推荐指数
1
解决办法
4488
查看次数

Oracle 12c分析功能

是否可以使用Oracle Analytic函数而不使用子查询在同一记录中的给定数据集中获取最小值Y的对应值X?

例如:

如果我具有以下数据集“ ds1”:

Col1  Col2
A     1
B     2
C     3
D     4
E     4
A     10
Run Code Online (Sandbox Code Playgroud)

通常,为了在Col1中找到对应于Col2中最小值“ 1”的值“ A”,我将编写以下查询:

select ds1.col1
     from ds1
          , (select min (col2) col2
                  from ds1) min_ds1
     where ds1.col2 = min_ds1.col2
/
Run Code Online (Sandbox Code Playgroud)

这是这种测试用例的执行代码:

### 1014.010, Start time is: 10/30/2019 11:39:35am

MYUN@MYDB-C1>>create table ds1 (col1 varchar2 (1), col2 number)
  2  /

Table created.
Elapsed: 00:00:00.01

MYUN@MYDB-C1>>insert into ds1 (col1, col2)
  2       select 'A', 1 from dual
  3       union all select 'B', 2 from dual …
Run Code Online (Sandbox Code Playgroud)

sql oracle analytic-functions oracle12c

3
推荐指数
1
解决办法
49
查看次数

基于ROW_Number的SQL查询无法正常工作

基本上我正在尝试查询只包含图像的页面.我需要提供tripID号码,然后提供ROWID(因为可能有多个图像)来接收单个图像.我将循环,直到每个图像都在html的相应图像框中.

这段代码似乎不起作用(我得到无效的列名'ROWID'),但是如果我删除AND ROWID ='1'它会返回所有图像及其行ID如下:

ROWID      PHOTO
    1      32jjr3h2jh23hj4h32jh42ll23j42 
    2       HU8308DJAOID9ASIDJI32C89EE29
Run Code Online (Sandbox Code Playgroud)

-

Select ROW_NUMBER() OVER (ORDER BY Photo ASC) AS ROWID, TBL_Photo.Photo
        From TBL_Photo
        left join TBL_TripDetails
        ON TBL_Photo.TripID=TBL_TripDetails.pkiTripID
        Where pkiTripID = '121' AND ROWID = '1'
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server analytic-functions

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

SQL分析函数 - 如何为分区分配编号?

我正在使用Oracle.

假设我有一个包含此样本的表,随机,内容:

columnA     | columnB  | content
--------------------------------
AfBkxZ      | 292      | a
LDglkK      | 181      | b
AfBkxZ      | 51       | c
AfBkxZ      | 315      | d
LDglkK      | 808      | e
Cee89g      | 1        | f
Run Code Online (Sandbox Code Playgroud)

我想在其中有一个视图,其中我对columnA中的每个值都有一个唯一的编号,并且对于其中columnA具有该值的行内的记录编号.

基于以上样本数据的结果:

Group_number | Record_number | columnB | content
------------------------------------------------
1            | 2             | 292     | a             (1.2)
3            | 1             | 181     | b             (3.1)
1            | 1             | 51      | c             (1.1)
1            | 3             | 315     | d             (1.3) …
Run Code Online (Sandbox Code Playgroud)

sql oracle analytic-functions

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

Oracle分析:在计算中使用LAG值?

我有一张表记录任务完成时间.任务属于工作流程,但在此示例中,我只是尝试让LAG正常工作.

我想找到有关每项任务需要多长时间的信息.

我试过了:

select
  completed_date,
  lag(completed_date) over (order by id) prevrow,
  prevrow - completed_date
from
  task_complete
where workflow_id = 1
Run Code Online (Sandbox Code Playgroud)

但这会导致错误.有没有办法计算当前行和上一行之间的差异?

oracle analytic-functions

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

Oracle Analytics窗口

鉴于下表

PAYMENT_Date  TRANSACTION_TYPE     PAYMENT_AMT
1/1/2012      P                    184366     
1/1/2012      R                    -5841     
1/2/2012      P                    941
1/3/2012      P                    901
1/3/2012      R                    5841
Run Code Online (Sandbox Code Playgroud)

以及以下查询:

select  payment_date, transaction_type, payment_amt,
        SUM(payment_amt) OVER(ORDER BY payment_date, transaction_type 
            RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS RUNNING_BALANCE
from    TABLE;
Run Code Online (Sandbox Code Playgroud)

我得到这些结果:

PAYMENT_Date  TRANSACTION_TYPE     PAYMENT_AMT  RUNNING_BALANCE
1/1/2012      P                    184366       0
1/1/2012      R                    -5841        -184366
1/2/2012      P                    941          -178525
1/3/2012      P                    901          -179466
1/3/2012      R                    5841         -180367
Run Code Online (Sandbox Code Playgroud)

预期:

PAYMENT_Date  TRANSACTION_TYPE     PAYMENT_AMT  RUNNING_BALANCE
1/1/2012      P                    184366       0
1/1/2012      R                    -5841        184366
1/2/2012      P …
Run Code Online (Sandbox Code Playgroud)

sql oracle analytic-functions oracle-analytics

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

基于范围的窗口框架只能有 1 个排序键

我试过运行下一个查询

select sum(balance) over (partition by client order by card desc, date_tr desc)
from table_1
Run Code Online (Sandbox Code Playgroud)

在结果中,我有下一条错误消息:

FAILED: SemanticException Range based Window Frame can have only 1 Sort key
Run Code Online (Sandbox Code Playgroud)

我不能在order by句子中使用 2 个排序键是真的吗?或者有一种方法如何使用 2 个排序键?

sql hive analytic-functions

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

如何编写SQL以获取累积值和每行总计?

说,我有以下数据:

  select 1 id, date '2007-01-16' date_created, 5 sales, 'Bob' name from dual union all
  select 2 id, date '2007-04-16' date_created, 2 sales, 'Bob' name from dual union all
  select 3 id, date '2007-05-16' date_created, 6 sales, 'Bob' name from dual union all
  select 4 id, date '2007-05-21' date_created, 4 sales, 'Bob' name from dual union all
  select 5 id, date '2013-07-16' date_created, 24 sales, 'Bob' name from dual union all
  select 6 id, date '2007-01-17' date_created, 15 sales, 'Ann' …
Run Code Online (Sandbox Code Playgroud)

sql oracle analytic-functions

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

oracle sql - 编号行组

我有下表,每周都有不同的价格,需要像上一栏一样的编号.具有相同价格的连续行应具有相同的数字,如11/12或18/19周.但另一方面,第2周和第16周的价格相同但不连续,所以他们应该得到不同的数字.

w | price    | r1 | need
===========================
1   167,93     1    1
2   180        1    2
3   164,72     1    3
4   147,42     1    4
5   133,46     1    5
6   145,43     1    6
7   147        1    7
8   147,57     1    8
9   150,95     1    9
10  158,14     1    10
11  170        1    11
12  170        2    11
13  166,59     1    12
14  161,06     1    13
15  162,88     1    14
16  180        2    15
17  183,15     1    16
18  195        1 …

sql oracle analytic-functions

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

在 MAX() OVER PARTITION 中包含 NULL

我有一个 Oracle 查询,我想在合并 NULL 时通过 PARTITION 返回 MAX()。

例如,如果原始数据是:

姓名 | 日期
-----------------------
亚当 | 01/21/14 00:00
亚当 | 
亚当 | 01/22/14 00:01
亚当 | 01/23/14 00:02

使用以下查询返回以下内容:

MAX(date) OVER (PARTITION BY name ORDER BY date)
Run Code Online (Sandbox Code Playgroud)
姓名 | 日期
-----------------------
亚当 | 01/21/14 00:00
亚当 | 01/22/14 00:01
亚当 | 01/23/14 00:02
亚当 | 01/23/14 00:02

是否有可能让它像 NULL 是一个 MAX() 值一样,所以它会返回以下内容?

姓名 | 日期
-----------------------
亚当 | 01/21/14 00:00
亚当 | 
亚当 | 
亚当 | 

sql oracle analytic-functions oracle10g window-functions

0
推荐指数
1
解决办法
2773
查看次数