2016-11-30 5 views
-1

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

| Col A | Col B | Col C | 
|-------|-------|-------| 
| 1 | A | 54 | 
| 1 | A | 56 | 
| 1 | B | 55 | 
| 1 | B | 51 | 
| 1 | C | 36 | 
| 1 | C | 23 | 
| 1 | D | 62 | 
| 1 | D | 11 | 
| 2 | B | 88 | 
| 2 | B | 17 | 
| 2 | C | 56 | 
| 2 | C | 86 | 
| 2 | D | 47 | 
| 2 | D | 29 | 

То, что я хочу сделать, это взять таблицу выглядеть следующим образом:

| Col A | Col B | Col C | 
|-------|-------|-------| 
| 1 | A | 54 | 
| 1 | A | 56 | 
| 2 | B | 88 | 
| 2 | B | 17 | 

Я уверен, что есть способ сделать это, я просто не знаю, как это сделать. Во-первых, я думал, что селектор DISTINCT ON будет работать, но он возвращает только одну запись для каждого значения. В этом случае мне нужно две записи для каждого значения.

+3

2 записи на основе * what *? –

+0

Извините. Только первые две записи каждого уникального значения в Col A. – John

+0

, так что первые две записи? A, B? так что заказ colb c? – xQbert

ответ

1

Один из способов сделать это было бы использовать оконную функцию, чтобы добавить номер строки для каждого раздела данных заказанные однако вы хотите, и затем выбрать что-нибудь с числом строк меньше 2.

With CTE AS (
SELECT colA, ColB, ColC, Row_Number() over (Partition by ColA ORDER By ColB , ColC) RN 
FROM Table) 
Select * from cte where RN <=2 

Поскольку я не знал, какие значения c вам нужны, я выбираю порядок по colC (по возрастанию), поэтому самые низкие значения C будут возвращены для данной комбинации A + B.

+1

Хотя неясно, что такое логика OP, я думаю, что 'ROW_NUMBER() OVER (PARTITION BY COLA ORDER BY ColB)' ближе к их желаемым результатам. – JNevill

0
with 
    grp as (select col_a from table group by col_a) -- It should be only index scan, not scanning the whole table 
select * from grp join lateral (
    select * from table 
    where grp.col_a = table.col_a 
    order by <desired order here> 
    limit 2) on true -- It also avoiding the full scan if properly indexes provided 
Смежные вопросы