暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 用秩分析函数计算差值百分比

askTom 2016-04-05
166

问题描述

尊敬的ASTOM团队,

我有以下几种表:

药品定价属性描述
 Name        Null?    Type
 ----------------------------------------- -------- ----------------------------
 DOCID        NOT NULL NUMBER(19)
 REVISIONID       NOT NULL NUMBER(19)
 PACPERUNIT         NUMBER(19,4)
 WACLASTUPDATE         VARCHAR2(50)
 WEEK          VARCHAR2(100)
 MINPROFITPERCENT        NUMBER(19,4)
 MODIFIEDBY         VARCHAR2(4000 CHAR)
 DATECREATED         TIMESTAMP(6)
 MINIMUMPRICE         NUMBER(19,4)
 CASHFILLQUANTITY        NUMBER(19,4)
 AWPLASTUPDATE         VARCHAR2(50)
 PACLASTUPDATE         VARCHAR2(50)
 COST          NUMBER(19,4)
 FILLINGFEE         NUMBER(19,4)
 DRUGCODE         VARCHAR2(100)
 COSTLASTUPDATE         VARCHAR2(50)
 DATEMODIFIED         TIMESTAMP(6)
 CALENDARMONTH         VARCHAR2(100)
 PRICINGQUANTITY        NUMBER(19,4)
 CREATEDBY         VARCHAR2(4000 CHAR)
 WAC          NUMBER(19,4)
 AWPPERUNIT         NUMBER(19,4)
 ROUNDING         NUMBER(19,4)

以及以下查询:
with cc as 
(SELECT ((c.currentcost - p.previouscost) / c.currentcost) * 100 changeper,
         c.drugcodecs,
         c.costlastupdatec,
         p.costlastupdatep,
         c.currentcost,
         p.previouscost
    FROM (SELECT costlastupdate costlastupdatec,
                 cost currentcost,
                 drugcode drugcodecs,
                 rank() over(partition BY drugcode ORDER BY to_date(costlastupdate, 'mm/dd/yyyy') DESC, rownum) rnk
            FROM DRUGPRICINGATTRIBUTES
           where drugcode in
                 (select code from drugmaster where isanchor = 'Y')) c
    JOIN (SELECT costlastupdate costlastupdatep,
                cost previouscost,
                drugcode,
                rank() over(partition BY drugcode ORDER BY to_date(costlastupdate, 'mm/dd/yyyy') DESC, rownum) rnk
           FROM DRUGPRICINGATTRIBUTES
          where 1 = 1
               --drugcode in (select code from drugmaster where isanchor='Y')
            and (drugcode, to_date(costlastupdate, 'mm/dd/yyyy')) NOT IN
                (SELECT drugcode, max(to_date(costlastupdate, 'mm/dd/yyyy'))
                   FROM DRUGPRICINGATTRIBUTES
                  where drugcode in
                        (select code from drugmaster where isanchor = 'Y')
                  GROUP BY drugcode)) p
      ON (c.rnk = 1 and p.rnk = 1 and c.drugcodecs = p.drugcode))
   select * from cc;


具有以下结果集:
 CHANGEPER DRUGCODECS  COSTLASTUPDATEC COSTLASTUPDATEP CURRENTCOST PREVIOUSCOST
---------- ----------- -------------- --------------   ----------- ------------
38.6728811 00074455290 01/05/2015     08/26/2014      .8153       .5
4.89982061 00078035934 01/12/2015     12/16/2014     4.6267      4.4
66.6363636 00378232101 01/05/2015     09/30/2014        .11    .0367
7.51288976 68382035406 12/20/2014     07/14/2014      .4073    .3767

基本上,如果成本发生了变化,它将显示变化百分比。

是否有更好的方法来编写此查询以优化性能。自动跟踪统计信息配置文件提供了以下信息:
Statistics
----------------------------------------------------------
   0  recursive calls
   0  db block gets
 140  consistent gets
   0  physical reads
   0  redo size
       1213  bytes sent via SQL*Net to client
 524  bytes received via SQL*Net from client
   2  SQL*Net roundtrips to/from client
   5  sorts (memory)
   0  sorts (disk)
   4  rows processed

感谢你在这方面的帮助。

谢谢你,
考沙尔鲁帕雷尔

专家解答

从我所能收集到的信息中,您需要最新的和次最新的每个药物代码的成本。也许是这样的:


SQL> drop table DRUGPRICINGATTRIBUTES purge;

Table dropped.

SQL>
SQL> create table DRUGPRICINGATTRIBUTES (
  2    costlastupdate date,
  3    cost int,
  4    drugcode varchar2(10)
  5  );

Table created.

SQL>
SQL> insert into DRUGPRICINGATTRIBUTES values ( sysdate,10,'A');

1 row created.

SQL> insert into DRUGPRICINGATTRIBUTES values ( sysdate-1,11,'A');

1 row created.

SQL> insert into DRUGPRICINGATTRIBUTES values ( sysdate-2,13,'A');

1 row created.

SQL> insert into DRUGPRICINGATTRIBUTES values ( sysdate-3,17,'A');

1 row created.

SQL>
SQL> insert into DRUGPRICINGATTRIBUTES values ( sysdate,14,'B');

1 row created.

SQL> insert into DRUGPRICINGATTRIBUTES values ( sysdate-10,17,'B');

1 row created.

SQL> insert into DRUGPRICINGATTRIBUTES values ( sysdate-20,12,'B');

1 row created.

SQL> insert into DRUGPRICINGATTRIBUTES values ( sysdate-30,22,'B');

1 row created.

SQL>
SQL> select * from DRUGPRICINGATTRIBUTES order by drugcode, costlastupdate desc;

COSTLASTU       COST DRUGCODE
--------- ---------- ----------
06-APR-16         10 A
05-APR-16         11 A
04-APR-16         13 A
03-APR-16         17 A
06-APR-16         14 B
27-MAR-16         17 B
17-MAR-16         12 B
07-MAR-16         22 B

8 rows selected.

SQL>
SQL> select *
  2  from (
  3  select d.*,
  4         first_value(cost) over ( partition BY drugcode ORDER BY costlastupdate DESC) n1,
  5         row_number() over ( partition BY drugcode ORDER BY costlastupdate DESC ) as r
  6  from DRUGPRICINGATTRIBUTES d
  7  )
  8  where r = 2;

COSTLASTU       COST DRUGCODE           N1          R
--------- ---------- ---------- ---------- ----------
05-APR-16         11 A                  10          2
27-MAR-16         17 B                  14          2

2 rows selected.

SQL>
SQL>


这让你可以访问你需要的价值


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论