2016-11-30 33 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

對不起。只是第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(COLB 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 
相關問題