2017-02-02 31 views
0

我有4列,如下圖所示:獨特的列對SQL

COL1 COL1_TIME COL2 COL2_TIME 
    A 09:20:00 E 09:35:00 
    A 09:20:00 F 09:36:00 
    A 09:20:00 G 09:40:00 
    A 09:20:00 H 09:59:00 
    B 09:25:00 E 09:35:00 
    B 09:25:00 F 09:36:00 
    B 09:25:00 G 09:40:00 
    B 09:25:00 H 09:59:00 
    C 09:30:00 E 09:35:00 
    C 09:30:00 F 09:36:00 
    C 09:30:00 G 09:40:00 
    C 09:30:00 H 09:59:00 
    D 09:50:00 H 09:59:00 

我不得不選擇列COL1和COL2值的唯一配對。要找到一對,應該在COL2_TIME中將最近的時間用於COL1_TIME。

等了該colsest時間E.對B公司的F - E的拍攝已經等

結果應該是這樣的:

A E 
B F 
C G 
D H 

任何想法?

+0

我敢肯定,這需要遞歸CTE的,而且我不認爲Vertica的支持的。 –

+0

@GordonLinoff:可以請您爲sql server編寫查詢 –

回答

0

如果COL1和COL2不同值的基數始終是1-1,沒有其他特殊場合/產生的異常存在,你可以做到以下幾點:

with temp1 as (

    select col1 
      ,col1_time 
      ,row_number() over (partition by col1 order by col1 desc) as rownum1 

), temp2 as(

    select col2 
      ,col2_time 
      ,row_number() over (partition by col2 order by col2 desc) as rownum2 

) 

    select distinct(temp1.col1) 
     ,distinct(temp2.col2) 
    from temp1,temp2  
    where temp1.rownum1 = temp2.rownum2  
0

好,不與公用表表達式遞歸,你需要硬連線幾件事情。 如果您有超過4個COL1的值,它會變得更乏味;如果它涉及一個非常重要的業務問題,請考慮爲此編寫一個UDx。

但是 - 否則 - 這裏是一個工程 - 包括在WITH子句的第一個公用表表達式輸入:

WITH 
input(col1,col1_time,col2,col2_time) AS (
      SELECT 'A',TIME '09:20:00','E',TIME '09:35:00' 
UNION ALL SELECT 'A',TIME '09:20:00','F',TIME '09:36:00' 
UNION ALL SELECT 'A',TIME '09:20:00','G',TIME '09:40:00' 
UNION ALL SELECT 'A',TIME '09:20:00','H',TIME '09:59:00' 
UNION ALL SELECT 'B',TIME '09:25:00','E',TIME '09:35:00' 
UNION ALL SELECT 'B',TIME '09:25:00','F',TIME '09:36:00' 
UNION ALL SELECT 'B',TIME '09:25:00','G',TIME '09:40:00' 
UNION ALL SELECT 'B',TIME '09:25:00','H',TIME '09:59:00' 
UNION ALL SELECT 'C',TIME '09:30:00','E',TIME '09:35:00' 
UNION ALL SELECT 'C',TIME '09:30:00','F',TIME '09:36:00' 
UNION ALL SELECT 'C',TIME '09:30:00','G',TIME '09:40:00' 
UNION ALL SELECT 'C',TIME '09:30:00','H',TIME '09:59:00' 
UNION ALL SELECT 'D',TIME '09:50:00','H',TIME '09:59:00' 
) 
, 
col1_A AS (
SELECT 
    col1 
, col2 
FROM input 
WHERE col1='A' 
ORDER BY ABS(TIMESTAMPDIFF('SECOND',col1_time::TIMESTAMP,col2_time::TIMESTAMP)) 
LIMIT 1 
) 
, 
col1_B AS (
SELECT 
    col1 
, col2 
FROM input 
WHERE col1='B' 
    AND col2 NOT IN (
    SELECT col2 FROM col1_A 
) 
ORDER BY ABS(TIMESTAMPDIFF('SECOND',col1_time::TIMESTAMP,col2_time::TIMESTAMP)) 
LIMIT 1 
) 
, 
col1_C AS (
SELECT 
    col1 
, col2 
FROM input 
WHERE col1='C' 
    AND col2 NOT IN (
       SELECT col2 FROM col1_A 
    UNION ALL SELECT col2 FROM col1_B 
) 
ORDER BY ABS(TIMESTAMPDIFF('SECOND',col1_time::TIMESTAMP,col2_time::TIMESTAMP)) 
LIMIT 1 
) 
, 
col1_D AS (
SELECT 
    col1 
, col2 
FROM input 
WHERE col1='D' 
    AND col2 NOT IN (
       SELECT col2 FROM col1_A 
    UNION ALL SELECT col2 FROM col1_B 
    UNION ALL SELECT col2 FROM col1_C 
) 
ORDER BY ABS(TIMESTAMPDIFF('SECOND',col1_time::TIMESTAMP,col2_time::TIMESTAMP)) 
LIMIT 1 
) 
      SELECT * FROM col1_A 
UNION ALL SELECT * FROM col1_B 
UNION ALL SELECT * FROM col1_C 
UNION ALL SELECT * FROM col1_D 
; 

如果不是你希望什麼,我不會感到驚訝...

玩的開心...

馬爾科理智