2017-02-02 6 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. Чтобы найти пару, вы должны занять самое близкое время до COL1_TIME в COL2_TIME.

Так colsest время А Е. Для В его F - E берется уже и т.д.

Результат должен выглядеть следующим образом:

A E 
B F 
C G 
D H 

Есть идеи?

+0

Я уверен, что это требует рекурсивных КТР, и я не думаю, что Vertica поддерживает тех. –

+0

@GordonLinoff: можете ли вы написать запрос для сервера sql –

ответ

0

Если мощность COL1 и Col2 различных значений не всегда 1-1 и никаких других особых случаев/существуют exeptions, вы можете сделать следующее:

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

Ну, без рекурсивных Common Table Expression, вам нужно проделать несколько вещей. И если у вас более 4 значений для COL1, это становится еще более утомительным; и если речь идет о очень важной бизнес-проблеме, подумайте над написанием UDx для этого.

Но - в противном случае - вот один, который работает - вход включен в первой общей таблице Экспрессии с пунктом:

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 
; 

Если это не то, что вы надеялись, что я не удивлюсь, ...

Счастливый игра ...

Marco здравомыслящий

Смежные вопросы