简体   繁体   English

Oracle DENSE_RANK()

[英]Oracle DENSE_RANK()

I'm trying to use the DENSE_RANK() function in Oracle as a way of attaching an arbitrary "primary key" onto unique groupings of data. 我正在尝试使用Oracle中的DENSE_RANK()函数作为将任意“主键”附加到数据的唯一分组的一种方式。 My dataset is a list of transactions, performed against different "ASSETS", at different "LOCATIONS" over the past several days. 我的数据集是过去几天针对不同“资产”在不同“资产”上执行的交易的列表。 The dataset is pre-ordered by ASSET ASC, DATE ASC as seen below. 数据集由ASSET ASC和DATE ASC进行了预排序,如下所示。


ASSET       LOCATION        DATE
A           LOC_A       9/1/2017
A          LOC_A        9/1/2017
A          LOC_B        9/5/2017
A          LOC_B        9/7/2017
A          LOC_A        9/11/2017
B          LOC_A        8/22/2017
B          LOC_C        8/25/2017
B          LOC_C        8/26/2017
B          LOC_A        9/2/2017
B          LOC_A        9/3/2017

When I use DENSE_RANK() OVER (ORDER BY ASSET, LOCATION), I get the following output: 当我使用DENSE_RANK()OVER(按资产排序,位置)时,得到以下输出:


ASSET       LOCATION        DATE        ACTUAL
A          LOC_A        9/1/2017        1
A          LOC_A        9/1/2017        1
A          LOC_B        9/5/2017        2
A          LOC_B        9/7/2017        2
A          LOC_A        9/11/2017       1
B          LOC_A        8/22/2017       3
B          LOC_C        8/25/2017       4
B          LOC_C        8/26/2017       4
B          LOC_A        9/2/2017        3
B          LOC_A        9/3/2017        3

However, I'm trying to figure out a way to get the value in the "EXPECTED" value shown here: 但是,我试图找出一种方法来获取此处所示的“ EXPECTED”值中的值:


ASSET       LOCATION        DATE        ACTUAL      EXPECTED
A          LOC_A        9/1/2017        1          1
A          LOC_A        9/1/2017        1          1
A          LOC_B        9/5/2017        2          2
A          LOC_B        9/7/2017        2          2
A          LOC_A        9/11/2017       1          3
B          LOC_A        8/22/2017       3          4
B          LOC_C        8/25/2017       4          5
B          LOC_C        8/26/2017       4          5
B          LOC_A        9/2/2017        3          6
B          LOC_A        9/3/2017        3          6

Any help in working towards this would be greatly appreciated. 在此方面的任何帮助将不胜感激。


My SQL is 我的SQL是

SELECT ASSET, LOCATION, TXNDATE, 
       DENSE_RANK() OVER (ORDER BY ASSET, LOCATION) AS DENSERANK 
FROM TEMPTABLE 
ORDER BY ASSET, TXNDATE 

and yes, I am getting the "ACTUAL" result shown above. 是的,我得到上面显示的“ ACTUAL”结果。

You are looking for changes in asset and location . 您正在寻找assetlocation变化。 One method uses lag() and a cumulative sum: 一种方法使用lag()和累积和:

SELECT ASSET, LOCATION, TXNDATE, 
       SUM(CASE WHEN Asset = prev_asset AND location = prev_location THEN 0
                ELSE 1
           END) OVER (ORDER BY TXNDATE) AS DENSERANK 
FROM (SELECT tt.*,
             LAG(ASSET) OVER (ORDER BY TXNDATE) as prev_asset,
             LAG(LOCATION) OVER (ORDER BY TXNDATE ) as prev_location
      FROM TEMPTABLE 
     ) tt
ORDER BY ASSET, TXNDATE;

Oracle defaults to RANGE BETWEEN rather than ROWS BETWEEN . Oracle默认使用RANGE BETWEEN而不是ROWS BETWEEN This is the behavior you want because you have rows with the same date and they should all be treated the same. 这是您想要的行为,因为您有带有相同日期的行,并且应该将所有行都视为相同。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM