PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да получите първи ред на група в PostgreSQL

Понякога може да се наложи да получите първи ред на група в PostgreSQL. Това може да бъде трудна заявка с обикновен SQL. За щастие PostgreSQL предлага функции на прозореца за такъв анализ на данни. Ето как да получите първи ред на група в PostgreSQL.

Как да получите първи ред на група в PostgreSQL

Ето стъпките за получаване на първи ред на група в PostgreSQL.

Да приемем, че имате следната таблица product_sales който съдържа продажби по отношение на продукта.

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

Да приемем, че искате да получите първи ред във всяка група, тоест за всеки продукт. Можете лесно да получите първия запис за всяка група, като използвате ФУНКЦИЯТА НА ПРОЗОРЪТ.

Бонус за четене:Как да получите номер на ред в PostgreSQL

Как да получите първи ред на група в PostgreSQL

Ето SQL заявката за получаване на първи запис за група. Първо задаваме номер на ред за всеки запис от група.

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

В горната заявка използваме номер_ред() функция за присвояване на номер на ред за всеки запис. Тъй като се нуждаем от отделно номериране на редовете за всяка група, ние използваме ФУНКЦИЯ ЗА ПРОЗОРЕЦ НА PARTITION. Казваме на Postgresql да раздели редовете по всеки продукт , тоест и сортирайте редовете за всяка група по order_date

След това просто трябва да използваме горния резултат, за да изберем редове, където 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

Горната заявка ще ви даде първия запис във всяка група.

Бонус за четене:Как да изчислим процентил в PostgreSQL

Как да получите последния ред на група в PostgreSQL

Ако искате да получите последния ред на група в PostgreSQL, просто променете реда на сортиране в клаузата PARTITION на горната заявка от възходящ на низходящ.

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

Надяваме се, че можете да получите първия запис във всяка група в PostgreSQL.

Ubiq улеснява визуализирането на данни за минути и наблюдение в табла за управление в реално време. Опитайте днес!

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL тригери и основи на съхранените функции

  2. PostgreSQL + Hibernate + Spring автоматично създаване на база данни

  3. Използване на текущото време в UTC като стойност по подразбиране в PostgreSQL

  4. Как да изтрия фиксиран брой редове със сортиране в PostgreSQL?

  5. Разлика между LIKE и ~ в Postgres