sql >> Database teknologi >  >> RDS >> Oracle

Oracle SQL betinget rangering

Hvis jeg forstår det rigtigt, kan du prøve at bruge CASE WHEN med sum vinduefunktion

CASE WHEN tjek col3 er ikke null akkumuler ellers vis NULL

CREATE TABLE T(
  col1 VARCHAR(5),
  col2 DATE,
  col3 DATE
);

INSERT INTO T VALUES ( 'a' , to_date('2018-01-20','YYYY-MM-DD') , to_date('2018-03-04','YYYY-MM-DD'));  
INSERT INTO T VALUES ( 'a' , to_date('2018-01-24','YYYY-MM-DD') , to_date('2018-04-04','YYYY-MM-DD'));  
INSERT INTO T VALUES ( 'b' , to_date('2018-01-02','YYYY-MM-DD') , to_date('2018-05-03','YYYY-MM-DD'));  
INSERT INTO T VALUES ( 'c' , to_date('2017-01-02','YYYY-MM-DD') , to_date('2017-05-08','YYYY-MM-DD'));  
INSERT INTO T VALUES ( 'd' , TO_DATE('2016-05-24','YYYY-MM-DD') , null);  
INSERT INTO T VALUES ( 'c' , TO_DATE('2018-02-05','YYYY-MM-DD') , to_date('2018-05-03','YYYY-MM-DD'));  
INSERT INTO T VALUES ( 'c' , TO_DATE('2018-07-28','YYYY-MM-DD') , null);  
 

Forespørgsel 1 :

select t1.*,
    rank() OVER(partition by col1 order by col2 desc) rank1,
    (CASE WHEN COL3 IS NOT NULL THEN
       SUM(CASE WHEN COL3 IS NOT NULL THEN 1 ELSE 0 END) OVER(partition by col1 order by col2 desc)
    ELSE
       NULL
    END) rank2
FROM T t1
 

Resultater :

| COL1 | COL2 | COL3 | RANK1 | RANK2 | |------|----------------------|----------------------|-------|--------| | a | 2018-01-24T00:00:00Z | 2018-04-04T00:00:00Z | 1 | 1 | | a | 2018-01-20T00:00:00Z | 2018-03-04T00:00:00Z | 2 | 2 | | b | 2018-01-02T00:00:00Z | 2018-05-03T00:00:00Z | 1 | 1 | | c | 2018-07-28T00:00:00Z | (null) | 1 | (null) | | c | 2018-02-05T00:00:00Z | 2018-05-03T00:00:00Z | 2 | 1 | | c | 2017-01-02T00:00:00Z | 2017-05-08T00:00:00Z | 3 | 2 | | d | 2016-05-24T00:00:00Z | (null) | 1 | (null) |

  1. HTML-formularindsættelse virker ikke i PHP og MySQL

  2. TRIM() Funktion i Oracle

  3. Hvordan kan jeg planlægge et job til at køre en SQL-forespørgsel dagligt?

  4. utf8 forvansket ved import til mysql