Использование Limit на Distinct group по значениям psql - PullRequest
0 голосов
/ 28 мая 2018

Предположим, у меня есть таблица, которая выглядит следующим образом, или, может быть, я иду в никуда.

create table customers (id text, name text, number int, useless text);

Со значениями

insert into customers (id, name, number, useless)
values
('1','apple',1, 'a'),
('2','banana',3, 'b'),
('3','pear',2, 's'),
('4','apple',1,'e'),
('5','banana',3,'s'),
('6','cherry',3, 'a'),
('7','cherry',4, 's'),
('8','apple',2, 'd'),
('9','banana',4, 'c'),
('10','pear',5, 'e');

Мой неудавшийся запрос psql такой.

select id, name, number, useless
from customers
where number < 4
group by customers.name limit 2

запрос, который я хочу использовать, он возвращает первые 2 уникальных сгруппированных по customer.name.Не первые 2 строки

В конце я хочу, чтобы он возвращал

    ('1','apple',1, 'a'),
    ('4','apple',1,'e'),
    ('8','apple',2, 'd'),
    ('2','banana',3, 'b'),
    ('5','banana',3,'s'),

, поэтому он возвращает первые 2 сгруппированных имени.Как мне сделать этот запрос?

Спасибо.

Редактировать:

Этот запрос - моя вторая попытка. Я знаю, что я вроде как близок.

select t.id, t.name, t.ranking
from (
SELECT id, name, dense_rank() OVER (order by name) as 
ranking
FROM customers
group by name
) t
where t.ranking < 3

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Функция group by customers.name не упорядочивает вывод, просто сгруппируйте их по customer.name, что вы хотите сделать, это правильно упорядочить группу?Так что я думаю, что вы хотите сделать:

select id, name, number, useless
from customers
group by name 
order by name []*

* [asc / desc] зависит от того, какой порядок вы хотите сделать:

  • asc - ascendent,
  • desc - потомок

Надеюсь, это поможет вам.

0 голосов
/ 28 мая 2018

Вы можете использовать dense_rank() как:

SELECT * FROM (
    SELECT DENSE_RANK() OVER (order by name) AS rank, temp.*
    FROM customers temp WHERE number < 4) data
WHERE data.rank <= 2

| rank| id|   name | number | useless |
|-----|---|--------|--------|---------|
|  1  | 4 | apple  | 1      | e       |
|  1  | 1 | apple  | 1      | a       |
|  1  | 8 | apple  | 2      | d       |
|  2  | 5 | banana | 3      | s       |
|  2  | 2 | banana | 3      | b       |
0 голосов
/ 28 мая 2018

попробуйте это:

select id, name, number, useless
from customers 
where name in (
  select name
  from customers
  where number < 4
  group by customers.name 
  order by name limit 2
)

| id |   name | number | useless |
|----|--------|--------|---------|
|  1 |  apple |      1 |       a |
|  2 | banana |      3 |       b |
|  4 |  apple |      1 |       e |
|  5 | banana |      3 |       s |
|  8 |  apple |      2 |       d |
|  9 | banana |      4 |       c |

SQL Fiddle DEMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...