2010-07-21 74 views
0

選擇行我有值表作爲如何基於唯一列

 
    ColumnA ColumnB 

    ASD  A 
    CSD  B 
    DSD  C 
    ESD  D 
    FSD  D 
    GSD  D 

A列的主鍵,我需要的結果是

 
    ColumnA ColumnB 

    ASD  A 
    CSD  B 
    DSD  C 
    ESD  D 

我想從B列&所有唯一值其關聯的第一個值columnA。

我試過幾個查詢&看了Google卻找不到ant解決方案。

謝謝, Rohit。

+0

你試過什麼疑問?他們給了什麼結果? – FrustratedWithFormsDesigner 2010-07-21 14:31:22

+1

「第一」是什麼意思? – pascal 2010-07-21 15:07:41

回答

3

首先按鍵順序(即按字母順序)。

SELECT MIN(ColumnA) AS ColumnA, ColumnB 
FROM tbl 
GROUP BY ColumnB 

由於某種原因,您已經標記了MySQL和Oracle。以上將在兩個工作。

Oracle還具有可幫助查詢的this general type的分析功能。

2
select min(columna) columna, columnb 
from mytable 
group by columnb; 
2

與分析(甲骨文):

SQL> WITH tab AS (
    2  SELECT 'ASD' columnA, 'A' columnB FROM DUAL 
    3  UNION ALL SELECT 'CSD', 'B' FROM DUAL 
    4  UNION ALL SELECT 'DSD', 'C' FROM DUAL 
    5  UNION ALL SELECT 'ESD', 'D' FROM DUAL 
    6  UNION ALL SELECT 'FSD', 'D' FROM DUAL 
    7  UNION ALL SELECT 'GSD', 'D' FROM DUAL 
    8 ) 
    9 SELECT columnA, columnB 
10 FROM (SELECT columnA, columnB, 
11     rank() over(PARTITION BY columnB ORDER BY columnA) rnk 
12   FROM tab) 
13 WHERE rnk = 1; 

COLUMNA COLUMNB 
------- ------- 
ASD  A 
CSD  B 
DSD  C 
ESD  D 
+0

我喜歡它:如果'first'的推斷定義結果不正確,則更容易改變。出於興趣,Oracle不需要派生表的名稱,那麼呢?你爲什麼選擇在CTE上使用派生表? – onedaywhen 2010-07-22 10:18:21

+0

@onedaywhen:由於我不熟悉SQL Server詞彙表,因此我不確定是否完全理解了您的問題。在使用子查詢時,Oracle不需要別名(與派生表是否相同?)。 'WITH'子句在Oracle中稱爲子查詢分解,我發現提供一個小型自包含示例很有用:您可以在環境中運行查詢,而無需創建任何其他對象(您無法創建#temporary表當會話在Oracle中結束時會自毀)。 – 2010-07-22 13:45:19

+0

我實際上使用的是標準SQL術語:)定義表tabned'tab'('SELECT ... UNION ALL SELECT ...')的子查詢被稱爲公用表表達式(CTE)和子查詢查詢'tab' CTE被稱爲派生表。但我會嘗試用Oracle術語對我的問題進行重新表述... – onedaywhen 2010-07-22 15:53:52

0
select min(ColumnA) as ColumnA,ColumnB from table 
group by ColumnB 
0
CREATE TABLE #t_Val 
(
    ColumnA VARCHAR(3) PRIMARY KEY 
, ColumnB CHAR(1) NOT NULL 
) 

INSERT #t_Val 
SELECT 'ASD' , 'A' 
UNION 
SELECT 'CSD' , 'B' 
UNION 
SELECT 'DSD' , 'C' 
UNION 
SELECT 'ESD' , 'D' 
UNION 
SELECT 'FSD' , 'D' 
UNION 
SELECT 'GSD' , 'D' 


SELECT MIN(ColumnA),ColumnB 
FROM #t_Val 
GROUP BY ColumnB 
0

做同樣的事情的另一種方式:

SELECT DISTINCT 
    FIRST_VALUE(ColumnA) 
    OVER (PARTITION BY ColumnB 
      ORDER BY ColumnA) AS ColumnA, 
    ColumnB 
FROM tbl 

這具有與使用優勢多於一列(即GROUP BY方法不行的地方) K)。

0

這裏是溶液

CREATE TABLE tbl_testcol1 VARCHAR(5)整理latin1_general_ci NOT NULL, col2 VARCHAR(5)整理latin1_general_ci NOT NULL, PRIMARY KEY(col1) )ENGINE = MyISAM的默認字符集= latin1 COLLATE = latin1_general_ci;

INSERT INTO tbl_test VALUES('ASD','A'); INSERT INTO tbl_test VALUES('CSD','B'); INSERT INTO tbl_test VALUES('DSD','C'); INSERT INTO tbl_test VALUES('ESD','D'); INSERT INTO tbl_test VALUES('FSD','D'); INSERT INTO tbl_test VALUES('GSD','D');


SELECT DISTINCT( COL2 )中,col1 FROM tbl_test GROUP BY COL2 LIMIT 0,30;