Musíte být obeznámeni se zadáváním údajů v jakémkoli systému správy databáze. Při zadávání dat možná nebudete mít čas a budete muset ignorovat mezery ve svých datech nebo chcete nějakou konzistentní sérii záznamů. V této situaci je PostgreSQL generate_series použitelný k dosažení požadovaného cíle. Jak název napovídá, mechanismus této funkce obsahuje buď 2 nebo 3 vstupy. i.E., generate_series umožňuje generovat posloupnost záznamů s počátečním bodem, koncovým bodem a zvyšující se hodnotou (volitelně). Funguje hlavně na dvou datových typech. i.E., Celá čísla a časová razítka. K vytvoření posloupnosti dat se funkce generate_series používá různými způsoby.
Syntax:
>> Generate_series ([start], [stop], [optional step / interval]);Popis syntaxe dotazu je následující:
- [Start]: Je výchozím bodem pro generování řady.
- [stop]: Toto ukazuje bod, kde se série zastaví.
- [interval]: Třetí, ale volitelná hodnota, znamená, o kolik se řada v každém kroku zvýší. Výchozí hodnota pro intervaly je 1.
Pojďme si udělat představu o tom, jak může fungovat funkce generate_series (). Níže uvádíme několik základních příkladů. Abychom pochopili koncept této funkce, musíme nainstalovat a otevřít prostředí příkazového řádku postgreSQL (psql).
Po úspěšné konfiguraci a při zadávání localhost, názvu databáze, čísla portu a hesla můžeme projít libovolným dotazem na psql.
Příklad 01: Generate_series pomocí DATE plus celočíselný operátor
Následující dotaz obsahuje vestavěnou funkci „DATE“ pro načtení aktuálního data. Zatímco „a“ je poskytován provozovatelem. Funkce tohoto operátora spočívá v přidání daného čísla (intervalu) do denní části data. Jinými slovy, ve specifických intervalech jsou dny posunuty a zobrazeny v datu. Na výstupu bude každý den přidán interval „9“, tj.E., 9 + 9 = 18, poté 27 atd., Dokud není dosaženo součtu 40.
>> SELECT current_DATE + s.a AS data FROM Generate_series (0,40,9) AS s (a);Příklad 02: Použití aktuálního data ke generování datové řady
Ke generování datových řad s pomocí aktuálního data používáme funkci now (), která automaticky přebírá aktuální datum ze systému. Můžete vidět, že odpovídající výstup ukazuje datum až 4 dny. Je to proto, že jsme omezili provádění přidáním 4 dnů k aktuálnímu datu. Protože jsme zadali časový interval do 1 dne, každé datum bude zvýšeno o 1 přidání za den
>> select * from generate_series (now (), now () + '4 days', '1 day');
Příklad 03: Generování řady dat pomocí časových značek
Časová razítka hodin: Tato funkce také používá datový typ časových značek. Časové razítko je v podstatě sled znaků, které poskytují čas a datum souvisejícího dne. Odpovídající funkce usnadňuje uživateli poskytovat data mezi oběma daty, která jsme v dotazu očekávali. Získá se seznam časových razítek od data 7 do 11 s jedním časovým razítkem každých 5 hodin.
>> select * from generate_series ('2021-3-7 00:00' :: timestamp, '2021-3-11 12:00', '5 hours');
Dotaz, jak je uvedeno výše, se také používá k přidání minut a sekund s hodinami k získání lepšího časového razítka mezi dny příslušného časového razítka.
Časová razítka dnů: V překračujícím příkladu jsme viděli, že časové razítko se používá k zobrazení dat mezi dvěma příslušnými daty, která jsme poskytli se změnou v hodinách zvýšenou o 5. V aktuálním příkladu uvidíme časové razítko ve dnech. Dny se zvyšují o 2, protože jsme zahájili dvoudenní mezeru v konkrétním výstupu.
>> select * from generate_series ('2021-03-01' :: timestamptz, '2021-03-19' :: timestamptz, '2 days');
Příklad 04: Generování konkrétních dat měsíce pomocí date_trunc
První den v měsíci
Pokud chceme vygenerovat první datum aktuálního měsíce, použijeme níže uvedený dotaz.Zde použitá odlišná funkce je date_trunc, která zkrátí datum na danou přesnost.i.E. Nyní()
>> select date_trunc ('month', now ());Poslední den v měsíci
Stejný přístup date_trunc vygeneruje poslední den v měsíci.
>> select date_trunc ('month', now ()) + '1 month' :: interval - '1 day' :: interval as end_of_month;V polovině měsíce
Polovina měsíce se získá změnou v předchozím dotazu. K dosažení příslušného cíle použijeme střední funkci. Nebo odečteme 17 dní od posledního.
>> select date_trunc ('month', now ()) + '1 month' :: interval - '17 days ':: interval as mid_of_month;
Příklad 05: Generování dat pomocí dat souvisejících s kalendářem
Zde je příklad použití dat kalendáře. Poznáme přestupný rok, tj.E., celkem dní v únoru měsíce.„T“ označuje true znamená, že rok je přestupný rok, a pro „f“ platí, že „dow“ představuje dny v týdnu. Sloupec „Únor“ obsahuje celkový počet dní v měsíci. „Den“ označuje Janův první den každého roku. Podle výzkumu začínají týdny ISO od pondělí a první týden v roce obsahuje 5. ledna roku.
>> vyberte datum :: datum, výpis ('isodow' od data) jako dow, to_char (datum, 'dy') jako den, výpis ('iso rok' od data) jako "iso rok", výpis ('týden') od data) jako týden, výpis („den“ z (datum + interval „2 měsíce - 1 den“)) jako únor, výpis („rok“ od data) jako rok, výpis („den“ z (datum + interval „ 2 měsíce - 1 den ')) = 29 jako skok od generate_series (datum' 2010-01-01 ', datum' 2020-03-01 ', interval' 1 rok ') jako t (datum);Isodow je „ISO“ standardní den v týdnu. Dotaz se bude provádět od roku 2010 do roku 2020 a bude manipulovat každý měsíc, týden a den v roce.
Příklad 06: Generování řady konkrétních dat a čísel dnů v týdnu
V tomto dotazu získáme data a čísla dnů filtrováním dnů v týdnu. Číselně budeme uvažovat dny v týdnu. Například od 0 do 6. Kde 0 je neděle a 6 je sobota. V tomto dotazu uvidíte, že jsme použili podmínku, abychom přinesli data a čísla dnů, která nejsou v číslech 2 a 5. Například 20. února byla sobota, takže počet, který se objevil, je 6.
>> s dny jako (vyberte dd, extrahujte (DOW z dd) dw z generate_series ('2021-02-20' :: date, '2021-03-05' :: date, '1 day' :: interval) dd ) vyberte * ze dnů, kdy dw není v (2,5);
Závěr
Článek, jak je uvedeno výše, pokrývá většinu základních funkcí souvisejících s generováním řad pro vytváření datových řad. Podrobné příklady diskutované v každém aspektu jsou tak smysluplné, že budou eskalovat znalosti vašeho článku.