Programim dhe zhvillim, javascript, python, php, html

Rreshti i migrimit të të dhënave të Oracle SQL në kolonë bazuar në muaj dështon për shkak të llojit

TABLE1

CODE    RATE1   type    MONTH
A       0       Acc1    201906
A       0       Acc1    201907
A       0       Acc1    201908
A       1       Acc1    201909
A       1       Acc1    201910
A       1       Acc1    201911
A       1       Acc1    201912
A       1       Acc1    202001
A       1       Acc1    202002
A       1       Acc1    202003
A       1       Acc1    202004
A       1       Acc1    202005
A       1       Acc1    202006
A       1       Acc1    202007
A       1       Acc1    202008
A       1       Acc1    202009

A       0       Acc2    201906
A       0       Acc2    201907
A       0       Acc2    201908
A       1       Acc2    201909
A       1       Acc2    201910
A       1       Acc2    201911
A       1       Acc2    201912
A       1       Acc2    202001
A       1       Acc2    202002
A       1       Acc2    202003
A       1       Acc2    202004
A       1       Acc2    202005
A       1       Acc2    202006
A       1       Acc2    202007
A       1       Acc2    202008
A       1       Acc2    202009

TABELA 2

CODE   RATE2    MONTH
A       10       202001
A       10       202002
A       10       202003
A       10       202004

Unë jam duke punuar në migrimin e të dhënave nga sistemi i vjetër në sistemin e ri. Si pjesë e të dhënave të sistemit të vjetër që mbahen në muaj dhe do të përditësojnë të njëjtin rresht nëse të dhënat e përditësuara dhe tabela përmban një rresht për një muaj, unë po migroj në sistemin e lajmeve dhe ai përmban datën e fillimit dhe datën e mbarimit për të bërë regjistrimin aktiv. Pra, me përditësimin, të dhënat e reja duhet të futen dhe përditësohen datën e fundit të rreshtit të vjetër

Unë kam disa tabela të cilave duhet t'i bashkohem dhe të gjej datën e fillimit dhe datën e mbarimit bazuar në tarifën1 dhe tarifën2. Tabela ime e parë përmban të dhënat për të gjithë muajt dhe të dhënat e tabelës së dytë të disponueshme derisa të dhënat aktive të dekative nuk do të jenë të disponueshme. nëse norma është e disponueshme dhe ne e konsiderojmë si 0.

Rezultati im i pritur

CODE    RATE1   RATE2   Type    START_DT    END_DT
A       0       0       Acc1    201906      201908
A       1       0       Acc1    201909      201912
A       1       10      Acc1    202001      202004
A       1       0       Acc1    202005      202009
A       0       0       Acc2    201906      201908
A       1       0       Acc2    201909      201912
A       1       10      Acc2    202001      202004
A       1       0       Acc2    202005      202009

Por unë jam duke marrë më poshtë rezultatin 23 rreshta.

    select code1, rate1, rate2, type, min(month) start_dt, 
    case when row_number() over(partition by code1 order by max(month) desc) = 1 then 999912 else max(month) end end_dt
from (
    select t1.month, code1, rate1, rate2, type,
        row_number() over(partition by code1 order by t1.month) rn1,
        row_number() over(partition by code1, type, rate1, rate2, type order by t1.month) rn2
    from table1 t1 left join table2 t2 on t1.code1 = t2.code2 and t1.month = t2.month
) t
group by code1, rate1, rate2, type, rn1 - rn2
order by start_dt

Ju lutem gjeni pyetjen time në këtë URL https://dbfiddle.uk/?rdbms=oracle_18&fiddle=b4f77cd13967c1c5a74efcacfb3d3a22

Faleminderit paraprakisht.

Ju lutemi komentoni nëse keni nevojë për më shumë informacion


Përgjigjet:


1

Ju jeni mjaft afër zgjidhjes së kësaj detyre boshllëqesh dhe ishujsh. Problemi është me kolonën type. Duhet të shkojë në klauzolën partition by të të dy funksioneve të dritares, kështu që është në përputhje me group by të jashtme.

Kjo ju jep rezultatin që dëshironi:

select code1, rate1, coalesce(rate2, 0), type, min(month) start_dt, max(month) end_dt
from (
    select t1.month, t1.code1, t1.rate1, t2.rate2, type,
        row_number() over(partition by t1.code1, t1.type order by t1.month) rn1,
        row_number() over(partition by t1.code1, t1.type, t1.rate1, t2.rate2 order by t1.month) rn2
    from table1 t1 
    left join table2 t2 on t1.code1 = t2.code2 and t1.month = t2.month
) t
group by code1, rate1, rate2, type, rn1 - rn2
order by type, start_dt

Shënime:

  • Nuk jam i sigurt për logjikën që dëshironi të zbatoni me transmetimin e datës në pyetjen e jashtme dhe nuk duket në përputhje me rezultatet e dëshiruara, kështu që e hoqa atë

  • kualifikoni të gjitha kolonat në nënpyetës me tabelën që i përkasin; kjo shmang dykuptimësinë

  • Unë rregullova gjithashtu klauzolën e jashtme order by në mënyrë që rezultatet të kthehen në rendin e dëshiruar dhe përdora coalesce() për të paracaktuar mungesën rate2s në 0

Demo në DB Fiddlde:

CODE1 | RATE1 | COALESCE(RATE2,0) | TYPE | START_DT | END_DT
:---- | ----: | ----------------: | :--- | -------: | -----:
A     |     0 |                 0 | Acc1 |   201906 | 201908
A     |     1 |                 0 | Acc1 |   201909 | 201912
A     |     1 |                10 | Acc1 |   202001 | 202004
A     |     1 |                 0 | Acc1 |   202005 | 202009
A     |     0 |                 0 | Acc2 |   201906 | 201908
A     |     1 |                 0 | Acc2 |   201909 | 201912
A     |     1 |                10 | Acc2 |   202001 | 202004
A     |     1 |                 0 | Acc2 |   202005 | 202009
08.10.2020

2

Mund të bashkoni dy tabelat dhe më pas të përdorni MATCH_RECOGNIZE:

SELECT code,
       rate1,
       rate2,
       type,
       first_month,
       last_month
FROM   (
  SELECT t1.code,
         t1.rate1,
         COALESCE( t2.rate2, 0 ) AS rate2,
         t1.type,
         t1.month
  FROM   table1 t1
         LEFT OUTER JOIN table2 t2
         ON ( t1.code = t2.code AND t1.month = t2.month )
)
MATCH_RECOGNIZE (
   PARTITION BY type
   ORDER BY month
   MEASURES
      FIRST( code ) AS code,
      FIRST( rate1 ) AS rate1,
      FIRST( rate2 ) AS rate2,
      FIRST( month ) AS first_month,
      LAST( month ) AS last_month
   ONE ROW PER MATCH
   PATTERN (FIRST_ROW SAME_RATES*)
   DEFINE
      SAME_RATES AS (    SAME_RATES.rate1 = PREV(SAME_RATES.rate1)
                     AND SAME_RATES.rate2 = PREV(SAME_RATES.rate2) )
)
ORDER BY type, first_month;

E cila, për të dhënat tuaja të mostrës:

CREATE TABLE table1 ( CODE, RATE1, type, MONTH ) AS
SELECT 'A', 0, 'Acc1', 201906 FROM DUAL UNION ALL
SELECT 'A', 0, 'Acc1', 201907 FROM DUAL UNION ALL
SELECT 'A', 0, 'Acc1', 201908 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc1', 201909 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc1', 201910 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc1', 201911 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc1', 201912 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc1', 202001 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc1', 202002 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc1', 202003 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc1', 202004 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc1', 202005 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc1', 202006 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc1', 202007 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc1', 202008 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc1', 202009 FROM DUAL UNION ALL

SELECT 'A', 0, 'Acc2', 201906 FROM DUAL UNION ALL
SELECT 'A', 0, 'Acc2', 201907 FROM DUAL UNION ALL
SELECT 'A', 0, 'Acc2', 201908 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc2', 201909 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc2', 201910 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc2', 201911 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc2', 201912 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc2', 202001 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc2', 202002 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc2', 202003 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc2', 202004 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc2', 202005 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc2', 202006 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc2', 202007 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc2', 202008 FROM DUAL UNION ALL
SELECT 'A', 1, 'Acc2', 202009 FROM DUAL;

CREATE TABLE table2 ( CODE, RATE2, MONTH ) AS
SELECT 'A', 10, 202001 FROM DUAL UNION ALL
SELECT 'A', 10, 202002 FROM DUAL UNION ALL
SELECT 'A', 10, 202003 FROM DUAL UNION ALL
SELECT 'A', 10, 202004 FROM DUAL;

Rezultatet:

CODE | RATE1 | RATE2 | TYPE | FIRST_MONTH | LAST_MONTH
:--- | ----: | ----: | :--- | ----------: | ---------:
A    |     0 |     0 | Acc1 |      201906 |     201908
A    |     1 |     0 | Acc1 |      201909 |     201912
A    |     1 |    10 | Acc1 |      202001 |     202004
A    |     1 |     0 | Acc1 |      202005 |     202009
A    |     0 |     0 | Acc2 |      201906 |     201908
A    |     1 |     0 | Acc2 |      201909 |     201912
A    |     1 |    10 | Acc2 |      202001 |     202004
A    |     1 |     0 | Acc2 |      202005 |     202009

db‹›fiddle këtu

08.10.2020
Materiale të reja

Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

Faketojeni derisa ta arrini me të dhënat false
A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

Si të përdorni kërkesën API në Python
Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

Një udhëzues hap pas hapi për të zotëruar React
Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

AI dhe Psikologjia — Pjesa 2
Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

Esencialet e punës ditore të kodit tim VS
Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..