SQL spojení tabulek s různým časovým rozlišením   otázka

SQL, Databáze

Dobrý den,

Chtěl bych spojit dvě tabulky, kde v první jsou záznamy uloženy změnově a v druhý hodinově.

Je možné dotazem vyčíst z tab.1 data v hodinovém rozlišení? Případně jak jich spojit když každá má jiné časové rozlišení.

tab 1. (Hodnota platí po celé období až po další záznam tzn. teplota 10 od 1.1.2017 00:00 - 1.1.2017 06:00)Datum Teplota

1.1.2017 10

1.1.2017 6:00 11

1.1.2017 23:00 9

Tab 2.Datum Proc

1.1.2017 78

1.1.2017 1:00 77

1.1.2017 2:00 78

1.1.2017 3:00 76

1.1.2017 4:00 77

Děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

jestli jsem to spravne pochopil, tak by mohlo byt resenim vycist tabulku 2 a k ni pripojit tabulku 1 tak, aby byly teploty tabulky 1 rozsekane na hodiny.

vyuzitim vnoreneho dotazu najdu ke kazdemu radku v tab2 nejvyssi mensi nebo stejnou casovou hodnotu v tab1.

podle nalezene hodnoty pripojim radek z tab1 (pokud hodnota nebyla nalezena, objevi se ve sloupcich teplota zmenova a datum_posledni zmeny hodnoty NULL ... zajisteno pomoci LEFT JOIN)

takto v mysql:

select t2.datum as hodina, t2.proc as teplota_hodinova, t1.teplota as teplota_zmenova, t1.datum as datum_posledni_zmeny
FROM tab2 t2
LEFT JOIN tab1 t1 ON  t2.datum >= t1.datum and t1.datum= (SELECT t1tmp.datum FROM tab1 t1tmp WHERE t1tmp.datum <= t2.datum ORDER BY t1tmp.datum DESC LIMIT 1) 

v MS SQL by melo byt nejak takto, ale nedavam za to ruku do ohne:

select t2.datum as hodina, t2.proc as teplota_hodinova, t1.teplota as teplota_zmenova, t1.datum as datum_posledni_zmeny
FROM tab2 t2
LEFT JOIN tab1 t1 ON  t2.datum >= t1.datum and t1.datum= (SELECT TOP 1 t1tmp.datum FROM tab1 t1tmp WHERE t1tmp.datum <= t2.datum ORDER BY t1tmp.datum DESC) 

kdyz jsem pridal do tab2 nasledujici dva zaznamy

1.1.2017 5:00 95

1.2.2017 6:00 96

tak mi dotaz vyhodil toto:

hodina	teplota_hodinova	teplota_zmenova	datum_posledni_zmeny
2017-01-01 00:00:00	78	10	2017-01-01 00:00:00
2017-01-01 01:00:00	77	10	2017-01-01 00:00:00
2017-01-01 02:00:00	78	10	2017-01-01 00:00:00
2017-01-01 03:00:00	76	10	2017-01-01 00:00:00
2017-01-01 04:00:00	77	10	2017-01-01 00:00:00
2017-01-01 05:00:00	95	10	2017-01-01 00:00:00
2017-01-01 06:00:00	96	11	2017-01-01 06:00:00
nahlásit spamnahlásit spam 0 odpovědětodpovědět

V Oraclu to nefunguje, nicméně mně to inspirovalo k tomuhle.

SELECT     *
FROM       ( SELECT datum,T AS teplota_ hodinova
           FROM    tab2
           WHERE   DATUM >= to_DATE('1.2.2018','dd.mm.yyyy hh24:mi:ss') AND DATUM < to_DATE('10.2.2018','dd.mm.yyyy hh24:mi:ss')) t2
           INNER JOIN (SELECT T AS teplota_zmenova,Datum,nextdate
                      FROM    (SELECT DATUM,
                             LEAD(DATUM) OVER (PARTITION BY VARIANTA,T ORDER BY DATUM) NEXTDATE, 
                                       T
                              FROM     tab1)
                      WHERE   (NEXTDATE>=to_DATE('1.2.2018 00:00:00','dd.mm.yyyy HH24:MI:SS') OR NEXTDATE IS NULL) AND DATUM<to_DATE('10.2.2018 00:00:00','dd.mm.yyyy HH24:MI:SS')) t1
           ON         t2.Datum>=t1.DATUM AND t2.Datum<t1.NEXTDATE
ORDER BY   Datum;
nahlásit spamnahlásit spam 0 odpovědětodpovědět

tak jsem ten muj dotaz zkusil upravit pro Oracle, kde se pouziva konstrukce s ROWNUM pro limitovani poctu vybranych radku.

jenom to nemam kde zkusit a oracle express se mi instalovat ted nechce ;-)

SELECT t2.datum as hodina, t2.proc as teplota_hodinova, t1.teplota as teplota_zmenova, t1.datum as datum_posledni_zmeny
FROM tab2 as t2
LEFT JOIN tab1 as t1 
    ON  t2.datum >= t1.datum and t1.datum= (
        SELECT t1tmp2.datum
        FROM (
            SELECT t1tmp.datum 
            FROM tab1 as t1tmp 
            WHERE t1tmp.datum <= t2.datum 
            ORDER BY t1tmp.datum DESC
        ) as t1tmp2
        WHERE ROWNUM=1
    )

ale ta vase varianta by mohla byt mozna rychlejsi pri vetsim mnozstvi zaznamu, kdyz pro kazdy radek z tab2 nevykonava znovu select k ziskani jedne jedine hodnoty

jo a kdyz uz oracle ...

napadlo me pouzit create sequence na vygenerovani hodinoveho kalendare v zadanem rozmezi datum_od-datum_do ...

a ke kazde hodine pres left join pripojit tab1 i tab2

ale jsem uz linej se tim zabejvat :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

aha, tak create sequence byl vystrel naslepo, omlouvam se ...

ale tady jsem nasel bandu triku jak vygenerovat posloupnost ... http://www.orafaq.com/wiki/Oracle_Row_Ge...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky mrknu na to.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback