Slouceni nekolika radku

17 views
Skip to first unread message

Tomáš Crhonek

unread,
Oct 5, 2025, 4:45:51 AM (9 days ago) Oct 5
to postgr...@googlegroups.com
Dobrý den všem

Dostala se ke mě tabulka, trochu nešťastná, kde je na každém řádku pouze jeden údaj. Přikládám ukázku:

ID, Jmeno, Prijmeni, Mesto
1, NULL, NULL, NULL
NULL, Tomas, NULL, NULL
NULL, NULL, Crhonek, NULL

a tak dále.

Lze nějak sloučit záznamy do řádku ID? Data jsou uspořádaná dle ID, takže bych si to uměl napsal v Golangu. Jde to přímo v PostgreSQL?

Díky,

Tomáš Crhonek

Pavel Stehule

unread,
Oct 5, 2025, 5:45:09 AM (9 days ago) Oct 5
to postgr...@googlegroups.com
Ahoj

ne 5. 10. 2025 v 10:45 odesílatel Tomáš Crhonek <tomasc...@gmail.com> napsal:
Asi by to slo, ale je potreba pri importu si tam nahodit nejakou pomocnou sekvenci - abys mel garantovano, ze data dostanes ve spravnem poradi

(2025-10-05 11:34:32) postgres=# select * from data;
┌───────┬────┬───────┬──────────┬───────┐
│ auxid │ id │ jmeno │ prijmeni │ mesto │
╞═══════╪════╪═══════╪══════════╪═══════╡
│     1 │  1 │ ∅     │ ∅        │ ∅     │
│     2 │  ∅ │ Tomas │ ∅        │ ∅     │
│     3 │  ∅ │ ∅     │ crhonek  │ ∅     │
│     4 │  2 │ ∅     │ ∅        │ ∅     │
│     5 │  ∅ │ pavel │ ∅        │ ∅     │
│     5 │  ∅ │ ∅     │ stehule  │ ∅     │
└───────┴────┴───────┴──────────┴───────┘
(6 rows)

(2025-10-05 11:34:50) postgres=# select any_value(id) as id, any_value(jmeno) as jmeno, any_value(prijmeni) as prijmeni, any_value(mesto) as mesto from (select *, max(id) over (order by auxid) from data) group by max order by 1;
┌────┬───────┬──────────┬───────┐
│ id │ jmeno │ prijmeni │ mesto │
╞════╪═══════╪══════════╪═══════╡
│  1 │ Tomas │ crhonek  │ ∅     │
│  2 │ pavel │ stehule  │ ∅     │
└────┴───────┴──────────┴───────┘
(2 rows)

asi by to slo i nejak chytreji (na jeden pruchod?) - z window funkci si ted vzpomenu jen na naproste zaklady. Jinak, to co bys delal v golangu by se dalo v blede modrem udelat v plpgsql skrz cteni kurzoru a jedne bufrovaci kompozitni promenne. Misto any_value by slo pouzit min, nebo max

Kdo tohle vymyslel? To je snad nejdebilnejsi format, co jsem kdy videl :-)

Pavel



Pavel 

Díky,

Tomáš Crhonek

--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „PostgreSQL-cz“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
Tuto diskuzi najdete na adrese https://groups.google.com/d/msgid/postgresql-cz/CADRny4Q2WWWLCykmvqt7rWvSDYcffJPiP8WYtKd4z-KWzDr%3Dzg%40mail.gmail.com.

Tomáš Crhonek

unread,
Oct 5, 2025, 5:48:01 AM (9 days ago) Oct 5
to postgr...@googlegroups.com
Díky, tohle vyzkouším.

Kdo to vymyslel raději ani nebudu říkat, je to z formuláře na jednom webu a ten borec toho o SQL mnoho nevěděl.

Tomáš


Pavel Stehule

unread,
Oct 5, 2025, 5:52:10 AM (9 days ago) Oct 5
to postgr...@googlegroups.com


ne 5. 10. 2025 v 11:48 odesílatel Tomáš Crhonek <tomasc...@gmail.com> napsal:
Díky, tohle vyzkouším.

Kdo to vymyslel raději ani nebudu říkat, je to z formuláře na jednom webu a ten borec toho o SQL mnoho nevěděl.

:-)

I tak je to kreativni 
 

David Turoň

unread,
Oct 6, 2025, 2:40:51 AM (8 days ago) Oct 6
to postgr...@googlegroups.com
Ahoj,

pres window asi takto... ale natvrdo poradi, takze by to muselo jit tak jak je v ukazce ...

SELECT lag (id,2) OVER w AS id, lag(jmeno,1) OVER w AS jmeno, prijmeni, mesto  FROM t WINDOW w AS (ROWS BETWEEN 3 PRECEDING AND CURRENT ROW);
          server_id: pgdist
   id   | jmeno  | prijmeni | mesto  
--------+--------+----------+--------
 <NULL> | <NULL> | <NULL>   | <NULL>
 <NULL> | <NULL> | <NULL>   | <NULL>
 1      | Tomas  | Crhonek  | <NULL>
 <NULL> | <NULL> | <NULL>   | <NULL>
 <NULL> | <NULL> | <NULL>   | <NULL>
 2      | Tomas2 | Crhonek2 | <NULL>
(6 řádek)

pak jen v druhem kroku vyfiltrovat NULL, pripadne doplnit i pro mesto a pridat ze pujde o vice radku ... Ano, horsi format uz asi neni:)

David

ne 5. 10. 2025 v 11:45 odesílatel Pavel Stehule <pavel....@gmail.com> napsal:

Pavel Stehule

unread,
Oct 6, 2025, 2:57:19 AM (8 days ago) Oct 6
to postgr...@googlegroups.com


po 6. 10. 2025 v 8:40 odesílatel David Turoň <turon...@gmail.com> napsal:
Ahoj,

pres window asi takto... ale natvrdo poradi, takze by to muselo jit tak jak je v ukazce ...

SELECT lag (id,2) OVER w AS id, lag(jmeno,1) OVER w AS jmeno, prijmeni, mesto  FROM t WINDOW w AS (ROWS BETWEEN 3 PRECEDING AND CURRENT ROW);
          server_id: pgdist
   id   | jmeno  | prijmeni | mesto  
--------+--------+----------+--------
 <NULL> | <NULL> | <NULL>   | <NULL>
 <NULL> | <NULL> | <NULL>   | <NULL>
 1      | Tomas  | Crhonek  | <NULL>
 <NULL> | <NULL> | <NULL>   | <NULL>
 <NULL> | <NULL> | <NULL>   | <NULL>
 2      | Tomas2 | Crhonek2 | <NULL>
(6 řádek)

pak jen v druhem kroku vyfiltrovat NULL, pripadne doplnit i pro mesto a pridat ze pujde o vice radku ... Ano, horsi format uz asi neni:)

kdyby tam aspon byla ta idcka, tak to uz se da udelat docela jednoduse - obycejnou agreagaci. Ale bez tech idcek je to bida. Mam pocit, ze timescale ma nejakou agregacni funkci na doplneni prazdne hodnoty na zaklade predchozi. Dala by se napsat jednoduse agregacni funkce - neco ve stylu last_used - ale je to prasarna (a na vetsich datech trochu risk). Pokud nedojde k soubehu, tak by Postgres vzdy mel vracet data ve stejnem poradi jako je fyzicke. Nicmene pokud dojde s soubehu s jinym scanem, tak postgres muze zacit cist tabulky od nahodneho mista - a pokud je v dotazu nejaky hash - hashagg, hashjoin - tak to "nahodne" preusporada data.

Ten format je sekvencni - a zkouset ho zpracovat relacne je +/- spis skolni uloha (a vzdycky to bude oser) - ve vysledku bych pouzil CSV parser v golangu a udelal bych to tam - a prevedl do neceho normalniho.

Pavel


Tomáš Crhonek

unread,
Oct 6, 2025, 3:38:43 AM (8 days ago) Oct 6
to postgr...@googlegroups.com
IDčka jednotlivých řádků tam jsou. Díky všem, nakonec jsem to prošel v Golangu. Na Windows fce se ještě podívám.

Tomáš


Pavel Stehule

unread,
Oct 6, 2025, 4:23:00 AM (8 days ago) Oct 6
to postgr...@googlegroups.com


po 6. 10. 2025 v 9:38 odesílatel Tomáš Crhonek <tomasc...@gmail.com> napsal:
IDčka jednotlivých řádků tam jsou. Díky všem, nakonec jsem to prošel v Golangu. Na Windows fce se ještě podívám.

ale nejsou za sebou - aspon ne v tom priklade, co jsi poslal

1
null
null
null
2
null
null
...

Kdyby tam byly na kazdem radku jako v podstate cizi klic, tak to uz je neco jineho

 

Pavel Stěhule

unread,
Oct 13, 2025, 8:27:13 AM (yesterday) Oct 13
to PostgreSQL-cz


Dne pondělí 6. října 2025 v 10:23:00 UTC+2 uživatel Pavel Stěhule napsal:


po 6. 10. 2025 v 9:38 odesílatel Tomáš Crhonek <tomasc...@gmail.com> napsal:
IDčka jednotlivých řádků tam jsou. Díky všem, nakonec jsem to prošel v Golangu. Na Windows fce se ještě podívám.

ale nejsou za sebou - aspon ne v tom priklade, co jsi poslal

1
null
null
null
2
null
null
...

Kdyby tam byly na kazdem radku jako v podstate cizi klic, tak to uz je neco jineho

v 19ce lze pouzit lag s klauzuli ignore nulls

(2025-10-13 14:26:20) postgres=# select coalesce(lag(a, 1) ignore nulls over (), a), a from foo;
┌──────────┬───┐
│ coalesce │ a │
╞══════════╪═══╡
│        1 │ 1 │
│        1 │ ∅ │
│        1 │ 2 │
│        2 │ ∅ │
│        2 │ ∅ │
└──────────┴───┘
(5 rows)

Pavel Stěhule

unread,
Oct 13, 2025, 8:28:38 AM (yesterday) Oct 13
to PostgreSQL-cz


Dne pondělí 13. října 2025 v 14:27:13 UTC+2 uživatel Pavel Stěhule napsal:


Dne pondělí 6. října 2025 v 10:23:00 UTC+2 uživatel Pavel Stěhule napsal:


po 6. 10. 2025 v 9:38 odesílatel Tomáš Crhonek <tomasc...@gmail.com> napsal:
IDčka jednotlivých řádků tam jsou. Díky všem, nakonec jsem to prošel v Golangu. Na Windows fce se ještě podívám.

ale nejsou za sebou - aspon ne v tom priklade, co jsi poslal

1
null
null
null
2
null
null
...

Kdyby tam byly na kazdem radku jako v podstate cizi klic, tak to uz je neco jineho

v 19ce lze pouzit lag s klauzuli ignore nulls

(2025-10-13 14:26:20) postgres=# select coalesce(lag(a, 1) ignore nulls over (), a), a from foo;
┌──────────┬───┐
│ coalesce │ a │
╞══════════╪═══╡
│        1 │ 1 │
│        1 │ ∅ │
│        1 │ 2 │
│        2 │ ∅ │
│        2 │ ∅ │
└──────────┴───┘
(5 rows)


(2025-10-13 14:26:24) postgres=# select coalesce(a, lag(a, 1) ignore nulls over ()), a from foo;

┌──────────┬───┐
│ coalesce │ a │
╞══════════╪═══╡
│        1 │ 1 │
│        1 │ ∅ │
│        2 │ 2 │
│        2 │ ∅ │
│        2 │ ∅ │
└──────────┴───┘
(5 rows)

Reply all
Reply to author
Forward
0 new messages