2016-06-27 3 views
0

Я пытаюсь заполнить «Col4» значениями со значениями выше, используя «Col1» и «Col3». Вот краткое описание столбцов: sql копирование дубликатов

  • Col1 - Пользователь Дата публикации
  • Col2 - Календарная дата
  • Col3 - Разница между датами в Col1
  • COL4 - сумма входа
  • Что в настоящее время данные выглядит следующим образом:

    | Col1   | Col2   | Col3  | Col4 
    | 2016-01-01 | 2016-01-01 | 3   | $10 
    | null   | 2016-01-02 | null  | null 
    | null   | 2016-01-03 | null  | null 
    | 2016-01-04 | 2016-01-04 | 1   | $2 
    | 2016-01-05 | 2016-01-05 | 2   | $7 
    | null   | 2016-01-06 | null  | null 
    | 2016-01-07 | 2016-01-07 | 3   | $5 
    | null   | 2016-01-08 | null  | null 
    | null   | 2016-01-09 | null  | null 
    
    Ожидаемые результаты:

    | Col1   | Col2   | Col3  | Col4 
    | 2016-01-01 | 2016-01-01 | 3   | $10 
    | null   | 2016-01-02 | null  | $10 
    | null   | 2016-01-03 | null  | $10 
    | 2016-01-04 | 2016-01-04 | 1   | $2 
    | 2016-01-05 | 2016-01-05 | 2   | $7 
    | null   | 2016-01-06 | null  | $7 
    | 2016-01-07 | 2016-01-07 | 3   | $5 
    | null   | 2016-01-08 | null  | $5 
    | null   | 2016-01-09 | null  | $5 
    

    Формула работает путем подсчета числа в Col3, а затем скопировать соответствующее количество в COL4 приведенные ниже строки. Col3 определяет количество строк ниже (включая собственную строку).

    В настоящее время я использую Sybase. У меня нет никаких идей о том, как я могу это сделать. Любая помощь будет оценена с благодарностью. Примечание: это выборка данных и сроки перейти от 2000 - 2016

    +1

    Что запрос для текущего набора результатов или эти строки в таблице? – Ash

    +0

    Это строки в таблице – henry91

    ответ

    0

    В SQL Server По данным выборочных данных мы можем достичь выше результата Устанавливается с помощью КТР

    Sample Data:

    declarE @Table1 TABLE 
        (Col1 varchar(10), Col2 varchar(10), Col3 varchar(4), Col4 varchar(4)) 
    ; 
    
    INSERT INTO @Table1 
        (Col1, Col2, Col3, Col4) 
    VALUES 
        ('2016-01-01', '2016-01-01', '3', '$10'), 
        (NULL, '2016-01-02', NULL, NULL), 
        (NULL, '2016-01-03', NULL, NULL), 
        ('2016-01-04', '2016-01-04', '1', '$2'), 
        ('2016-01-05', '2016-01-05', '2', '$7'), 
        (NULL, '2016-01-06', NULL, NULL), 
        ('2016-01-07', '2016-01-07', '3', '$5'), 
        (NULL, '2016-01-08', NULL, NULL), 
        (NULL, '2016-01-09', NULL, NULL) 
    ; 
    

    Сценарий:

    WITH cte 
        AS (SELECT T1.Col1, 
           T1.Col2, 
           T1.Col3, 
    
           Col4 = COALESCE(T1.Col4, (SELECT TOP 1 Col4 
                 FROM @Table1 T2 
                 WHERE T2.Col2 < T1.Col2 
                  AND Col4 IS NOT NULL 
                 ORDER BY Col2 DESC)) 
         FROM @Table1 T1) 
    UPDATE T 
    SET  
         T.Col4 = C.Col4 
    FROM @Table1 T 
         INNER JOIN cte C 
           ON T.col2 = C.col2 
    WHERE T.col1 IS NULL 
         OR T.col2 IS NULL 
         OR T.col3 IS NULL 
    
         Select * from @Table1 
    
    +0

    Эй, спасибо за помощь! К сожалению, эта версия sybase не поддерживает 'with' – henry91

    +0

    Я сам ее решил. Ваш сценарий намекнул мне, чтобы ответить спасибо! – henry91

    +0

    @ henry91 Я понятия не имею, как писать в Sybase, но все концепции RDBMS очень похожи в логике, поэтому я решил сделать это. Это помогло вам двигаться в своем сценарии. Большая работа – mohan111

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

    • Нет связанных вопросов^_^