2017-02-02 29 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 
; 

如果不是你希望什么,我不会感到惊讶...

玩的开心...

马尔科理智