2017-08-25 65 views
1

您可以請這個noob查詢幫助嗎?SQL Query根據最小值+非重複顯示行

需要僅第一顯示 「T」(分 「ID」),用於每每個 「C」 的 「S」:

id |c | s | t 
--- |--- |--- |--- 
1 | C1 | S1 | TA 
2 | C1 | S1 | TA 
3 | C1 | S1 | TB 
4 | C2 | S3 | TA 
5 | C2 | S3 | TC 
6 | C1 | S2 | TC 
7 | C9 | S2 | TF 
8 | C9 | S4 | TA 
9 | C8 | S2 | TB 

因此,在給定的例子中,最終的結果將是:

id |c | s | t 
--- |--- |--- |--- 
1 | C1 | S1 | TA 
4 | C2 | S3 | TA 
6 | C1 | S2 | TC 
7 | C9 | S2 | TF 
8 | C9 | S4 | TA 
9 | C8 | S2 | TB 

編輯:試圖在MySQL 5.7中做到這一點 謝謝!

+0

請給你的DBMS標記 – JohnHC

+0

感謝大家的快速響應! – user8512672

回答

0

SQL服務器,Oracle和Postgres:

with CTE as 
(
select t1.*, 
     row_number() over(partition by c,s order by id) rn 
from t1 
) 
select t1.* 
from CTE 
where rn = 1 

MySQL的

select t1.* 
from t1 
inner join 
(
select c,s,min(id) as minid 
from t1 
group by c,s 
) x2 
on --x2.c = t1.c -- oops, don't need these 
--and x2.s = t1.s 
--and 
x2.minid = t1.id 
+0

對不起noob,但MySQL不支持cte?因爲我無法得到這個工作。 – user8512672

+0

@ user8512672請參閱編輯 – JohnHC

0
DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,c CHAR(2) NOT NULL 
,s CHAR(2) NOT NULL 
,t CHAR(2) NOT NULL 
); 

INSERT INTO my_table VALUES 
(1,'C1','S1','TA'), 
(2,'C1','S1','TA'), 
(3,'C1','S1','TB'), 
(4,'C2','S3','TA'), 
(5,'C2','S3','TC'), 
(6,'C1','S2','TC'), 
(7,'C9','S2','TF'), 
(8,'C9','S4','TA'), 
(9,'C8','S2','TB'); 


SELECT a.* 
    FROM my_table a 
    JOIN 
    (SELECT MIN(id) id FROM my_table GROUP BY c,s) b 
    ON b.id = a.id; 
+----+----+----+----+ 
| id | c | s | t | 
+----+----+----+----+ 
| 1 | C1 | S1 | TA | 
| 6 | C1 | S2 | TC | 
| 4 | C2 | S3 | TA | 
| 9 | C8 | S2 | TB | 
| 7 | C9 | S2 | TF | 
| 8 | C9 | S4 | TA | 
+----+----+----+----+ 
0
select * from table_name where id in (select min(id) from table_name group by c, s); 

此查詢將使用MySQL。

+0

謝謝!這似乎工作,看起來像最簡單的解決方案:) – user8512672

+0

樂於幫助,並歡迎堆棧溢出。如果此答案或任何其他人解決了您的問題,請將其標記爲已接受。 – sowmya