微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用较少的null数到没有null的列对行进行排序

如何解决使用较少的null数到没有null的列对行进行排序

大家好,我有一个问题:

具有此查询

CREATE SEQUENCE SEQ_prices MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 2206 NOCACHE  ORDER  NOCYCLE  NOKEEP  NOSCALE  GLOBAL;


CREATE TABLE PRICES_INFO ( 
     ID NUMBER(19,0) DEFAULT SEQ_prices.nextval  NOT NULL,QUARTER VARCHAR2(256 CHAR),COD_T1 VARCHAR2(256 CHAR),COD_T2 VARCHAR2(256 CHAR),COD_T3 VARCHAR2(256 CHAR),COD_T4 NUMBER(19,0),COD_T5 VARCHAR2(256 CHAR),COD_T6 VARCHAR2(256 CHAR),COD_T7 NUMBER(19,COD_T8 VARCHAR2(256 CHAR),COD_T9 VARCHAR2(256 CHAR),PREC_T1    NUMBER(19,6),PREC_T2    NUMBER(19,PREC_T3    NUMBER(19,PREC_T4    NUMBER(19,PREC_T5    NUMBER(19,PREC_T6    NUMBER(19,PREC_T7    NUMBER(19,PREC_T8    NUMBER(19,PREC_T9    NUMBER(19,6)
);

以及那些插入内容

insert into prices_info (quarter,cod_t1,cod_t2,cod_t3,cod_t4,cod_t5,cod_t6,cod_t7,cod_t8,cod_t9,prec_t1,prec_t2,prec_t3,prec_t4,prec_t5,prec_t6,prec_t7,prec_t8,prec_t9) values ('Q1','PEUY',null,856,711,'TZRS',98.1,12.69,83.09,77.32,13.3,null);
insert into prices_info (quarter,'XWIK','EZYI','GJJL','KQMH',771,'FENL','CUPQ',75.19,61.56,72.09,54.32,66.32);
insert into prices_info (quarter,'QUCJ','PZEG',511,'KWVY','LUPZ',725,89.12,32.15,20.43,48.21,58.19);
insert into prices_info (quarter,'HDWM',865,'ZTQA',98.16,88.48,12.68,23.04);
insert into prices_info (quarter,'TVDB','LCVE','OEDD','JQTL','CWFH',95.98,56.02,26.02,53.9);
insert into prices_info (quarter,'QODQ','YCGT',289,'GSHJ','PXGZ',44.8,58.98,83.21,22.77,98.47,66.39,41.09);
insert into prices_info (quarter,'UNJU','DQNN','CQSL',31.43,81.36,37.27,58.15,'XDMW','QLVX',995,'UGWE',593,'QPJT',26,32.89,60.81,'ELCV','PGPF',892,'VNXH',435,48.17,70.64,95.88,71.31,'BKOD','HYBX',839,'KWGD',229,'NPRL',65.32,94.17,20.97,36.97,46.27,18.91);

我需要对这些行进行排序才能看到:

enter image description here

我当时在考虑使用游标查看结果,但我需要知道标题名称(因为如果您在每次交互时都看到图像,标题就会发生变化)以及该标题和包含的信息其余信息(所有列PREC_XXX)

说真的,我不知道如何开始,有人可以帮助我吗?

最诚挚的问候

解决方法

这很痛苦。基本上,一种方法使用大量的case表达式,例如:

order by 
    (case when cod_t1 is null then 1 else 0 end)
    + (case when cod_t2 is null then 1 else 0 end)
    + (case when cod_t3 is null then 1 else 0 end)
    + ...

修复数据模型以将代码存储为而不是列将更加容易。然后,您可以使用聚合:

select id,quarter
from mytable
group by id,quarter
order by count(cod) desc
,

您可以使用横向连接和聚合。这应该起作用:

select id,quarter,max(case when seqnum_cod = 1 then cod end) as cod_1,max(case when seqnum_cod = 2 then cod end) as cod_2,. . .,max(case when seqnum_prec = 1 then cod end) as prec_1,max(case when seqnum_prec = 2 then cod end) as prec_2,from (select pi.*,row_number() over (partition by pi.id
                                order by (case when cod is not null then ord end) nulls last
                               ) as seqnum_cod,row_number() over (partition by pi.id
                                order by (case when prec is not null then ord end) nulls last
                               ) as seqnum_prec,from prices_info pi cross join lateral
           (select pi.cod_t1 as cod,prec_t1 as prec,1 as ord from dual union all
            select pi.cod_t2 as cod,prec_t2,2 as ord from dual union all
            . . . 
           ) t
     ) t
group by id,quarter;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。