Как получить требуемый вывод, я пытался с GROUP BY, но не смог получить то, что я хочу - PullRequest
0 голосов
/ 02 марта 2020

У меня есть эта таблица

\d sales_girls

  Column   |         Type         | Collation | Nullable | Default
-----------+----------------------+-----------+----------+---------
 id        | character varying(4) |           |          |
 f_name    | character varying(8) |           |          |
 sale      | integer              |           |          |
 sale_date | date                 |           |          |

SELECT * FROM p8.sales_girls;

  id  | f_name | sale | sale_date
------+--------+------+------------
 E001 | Linda  | 1000 | 2016-01-30
 E002 | Sally  |  750 | 2016-01-30
 E003 | Zindy  |  500 | 2016-01-30
 E001 | Linda  |  150 | 2016-02-01
 E001 | Linda  | 5000 | 2016-02-01
 E002 | Sally  |  250 | 2016-02-01
 E001 | Linda  |  250 | 2016-02-02
 E002 | Sally  |  150 | 2016-02-02
 E003 | Zindy  |   50 | 2016-02-02
(9 rows)

предполагаемый вывод

Я хочу выбрать строки, имеющие максимум каждой девушки

  id  | f_name | sale | sale_date
------+--------+------+------------
 E002 | Sally  |  750 | 2016-01-30
 E003 | Zindy  |  500 | 2016-01-30
 E001 | Linda  | 5000 | 2016-02-01
(9 rows)

Я пытался

SELECT id, f_name, MAX(sale), sale_date
FROM p8.sales_girls
GROUP BY f_name; 

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Используйте PostgreSQL s DISTINCT ON предложение:

SELECT DISTINCT ON (id)
       id, f_name, sale, sale_date
FROM p8.sales_girls
ORDER BY id, sale DESC;

Ваш стол не выглядит должным образом нормализованным, поскольку id, кажется, идентифицирует "продавщицу".

0 голосов
/ 02 марта 2020

Вы можете сделать это:

select id,f_name,sale,sale_date from (        
    select id,f_name,sale,sale_date,max(sale) OVER (PARTITION BY id) max_sale  from  sales_girls 
) a where sale=max_sale

Но что произойдет, если у Линды будет две линии с продажей 5000?

, если вы хотите в этом случае установить максимальную дату:

select id,f_name,sale,max(sale_date) sale_date from (         
select id,f_name,sale,sale_date,max(sale) OVER (PARTITION BY id) max_sale  from sales_girls 
    ) a where sale=max_sale
group by 1,2,3
...