sqlite3 запрашивает определенное количество строк каждого идентификатора - PullRequest
0 голосов
/ 26 мая 2020

Я хотел бы запросить базу данных следующим образом:

table person

id  name     age    weight
1   teste1   18     101
1   teste2   18     102
1   teste3   18     103
1   teste4   18     104
1   teste5   18     105
1   teste6   18     106
2   teste7   18     91  
2   teste8   18     92
2   teste9   18     93
2   teste9   18     94
2   teste1   18     95
2   teste2   18     96
3   teste3   18     87
3   teste3   18     88
3   teste3   18     89
3   teste3   18     81
3   teste3   18     82
3   teste3   18     83
3   teste3   18     84
3   teste3   18     85

, и результатом должно быть 3 наивысших веса каждого идентификатора, например:

id  name     age    weight
1   teste4   18     106
1   teste5   18     105
1   teste6   18     104
2   teste9   18     96
2   teste1   18     95
2   teste2   18     94
3   teste3   18     89
3   teste3   18     88
3   teste3   18     87

может мне кто-нибудь помочь? С уважением

1 Ответ

2 голосов
/ 26 мая 2020

С функцией окна ROW_NUMBER():

select t.id, t.name, t.age, t.weight
from (
  select *, row_number() over (partition by id order by weight desc) rn
  from tablename
) t
where t.rn <= 3
order by t.id, t.weight desc

См. Демонстрацию .

Без оконных функций вы можете использовать коррелированный подзапрос в предложении WHERE:

select t.id, t.name, t.age, t.weight
from tablename t
where (select count(*) from tablename where id = t.id and weight >= t.weight) <= 3
order by t.id, t.weight desc;

См. demo .

Результаты:

| id  | name   | age | weight |
| --- | ------ | --- | ------ |
| 1   | teste6 | 18  | 106    |
| 1   | teste5 | 18  | 105    |
| 1   | teste4 | 18  | 104    |
| 2   | teste2 | 18  | 96     |
| 2   | teste1 | 18  | 95     |
| 2   | teste9 | 18  | 94     |
| 3   | teste3 | 18  | 89     |
| 3   | teste3 | 18  | 88     |
| 3   | teste3 | 18  | 87     |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...