sql >> Databáze >  >> RDS >> PostgreSQL

Jak získat první řádek na skupinu v PostgreSQL

Někdy možná budete muset získat první řádek na skupinu v PostgreSQL. To může být obtížný dotaz pomocí prostého SQL. Naštěstí PostgreSQL nabízí funkce okna pro takovou analýzu dat. Zde je návod, jak získat první řádek na skupinu v PostgreSQL.

Jak získat první řádek na skupinu v PostgreSQL

Zde jsou kroky k získání prvního řádku na skupinu v PostgreSQL.

Řekněme, že máte následující tabulku prodej_produktů který obsahuje produktový prodej.

postgres=# create table product_sales(
             product varchar(255),
             order_date date, 
             sale int);

postgres=# insert into product_sales(product,order_date, sale)
           values('A','2020-05-01',250),
           ('B','2020-05-01',350),
           ('C','2020-05-01',1250),
           ('A','2020-05-02',450),
           ('B','2020-05-02',650),
           ('C','2020-05-02',1050),
           ('A','2020-05-03',150),
           ('B','2020-05-03',250),
           ('C','2020-05-03',1850);

postgres=# select * from product_sales;
 product | order_date | sale
---------+------------+------
 A       | 2020-05-01 |  250
 B       | 2020-05-01 |  350
 C       | 2020-05-01 | 1250
 A       | 2020-05-02 |  450
 B       | 2020-05-02 |  650
 C       | 2020-05-02 | 1050
 A       | 2020-05-03 |  150
 B       | 2020-05-03 |  250
 C       | 2020-05-03 | 1850

Řekněme, že chcete získat první řádek v každé skupině, tedy pro každý produkt. První záznam pro každou skupinu můžete snadno získat pomocí FUNKCE WINDOW.

Bonusové čtení:Jak získat číslo řádku v PostgreSQL

Jak získat první řádek na skupinu v PostgreSQL

Zde je dotaz SQL pro získání prvního záznamu na skupinu. Nejprve přiřadíme číslo řádku pro každý záznam na skupinu.

postgres=# select
            *,
           row_number() over (partition by product order by order_date asc) 
           as row_number
           from product_sales;
 product | order_date | sale | row_number
---------+------------+------+------------
 A       | 2020-05-01 |  250 |          1
 A       | 2020-05-02 |  450 |          2
 A       | 2020-05-03 |  150 |          3
 B       | 2020-05-01 |  350 |          1
 B       | 2020-05-02 |  650 |          2
 B       | 2020-05-03 |  250 |          3
 C       | 2020-05-01 | 1250 |          1
 C       | 2020-05-02 | 1050 |          2
 C       | 2020-05-03 | 1850 |          3

Ve výše uvedeném dotazu používáme row_number() funkce pro přiřazení čísla řádku pro každý záznam. Protože pro každou skupinu potřebujeme samostatné číslování řádků, použijeme FUNKCI ROZDĚLENÍ OKNA. Říkáme Postgresql, aby rozdělil řádky podle každého produktu , to znamená a seřadit řádky pro každou skupinu podle datum_objednávky

Dále musíme použít výše uvedený výsledek k výběru řádků, kde row_number=1

postgres=# select *
           from (
            select
                *,
               row_number() over (partition by product order by order_date asc) 
               as row_number
             from product_sales
             ) temp where row_number=1;
 product | order_date | sale | row_number
---------+------------+------+------------
 A       | 2020-05-01 |  250 |          1
 B       | 2020-05-01 |  350 |          1
 C       | 2020-05-01 | 1250 |          1

Výše uvedený dotaz vám poskytne první záznam v každé skupině.

Bonusové čtení:Jak vypočítat percentil v PostgreSQL

Jak získat poslední řádek na skupinu v PostgreSQL

Pokud chcete získat poslední řádek na skupinu v PostgreSQL, jednoduše změňte pořadí řazení v klauzuli PARTITION výše uvedeného dotazu ze vzestupného na sestupné.

postgres=# select *
           from (
           select
             *,
             row_number() over (partition by product order by order_date desc) 
             as row_number
             from product_sales
           ) temp where row_number=1;
 product | order_date | sale | row_number
---------+------------+------+------------
 A       | 2020-05-03 |  150 |          1
 B       | 2020-05-03 |  250 |          1
 C       | 2020-05-03 | 1850 |          1

Doufejme, že můžete získat první záznam v každé skupině v PostgreSQL.

Ubiq usnadňuje vizualizaci dat během několika minut a sledování na řídicích panelech v reálném čase. Vyzkoušejte to ještě dnes!

  1. Jak odstranit všechny neabecední znaky z řetězce na serveru SQL?

  2. Použití indexů v tabulkách s optimalizovanou pamětí serveru SQL

  3. java.math.BigInteger nelze přetypovat na java.lang.Integer

  4. Jak rychlé je ODBC? "Nabité" srovnání.