Как реализовать scd тип 2 для следования

#sql #sql-server #scd

#sql #sql-сервер #scd

Вопрос:

У нас есть следующие данные:

Таблица фактов :

 id | key   | name    | salary | loaction | start_date
1  | emp_1 | Shubham | 10000  | Delhi    | 1998-02-01
2  | emp_2 | Ashish  | 12000  | Pune     | 2000-01-01
3  | emp_3 | Shubham | 15000  | Mumbai   | 2002-01-01
 

Ожидаемый результат:

 id | key   | name    | salary | loaction | start_date | end_date   | inactive
1  | emp_1 | Shubham | 10000  | Delhi    | 1998-02-01 | 2002-01-01 | 0
2  | emp_2 | Ashish  | 12000  | Pune     | 2000-01-01 | null       | 1
3  | emp_3 | Shubham | 15000  | Mumbai   | 2002-01-01 | null       | 1
 

Я хочу реализовать это.

У нас есть дата начала в таблице фактов и emp_key, которая уникальна, и мы хотим создать таблицу dim, в которой мы должны показывать флаг isactive и дату начала и дату окончания. Дата окончания будет такой же, как и дата начала следующего местоположения. Как и в примере для shubham 2002-01-01, это дата окончания для Дели и дата начала для Мумбаи..

Пожалуйста, дайте решение для sql-сервера.

Я пробовал решение с объявлением переменной и передачей значения, но это невозможно, когда у нас тысячи строк..

Комментарии:

1. У вас нет столбца с именем «emp_key». И вы приравниваете emp_3 к emp_1 на основе только имени — вы предполагаете, что есть только один человек по имени Шубхам? Редко это безопасное предположение. Что происходит при изменении имени (и да — это происходит)?

Ответ №1:

Здесь вы можете использовать LEAD аналитическую функцию:

 SELECT
    id,
    [key],
    name,
    salary,
    location,
    start_date,
    LEAD(start_date) OVER (PARTITION BY [key] ORDER BY start_date) end_date,
    CASE WHEN LEAD(start_date) OVER
              (PARTITION BY [key] ORDER BY start_date) IS NOT NULL
         THEN 0 ELSE 1 END isactive
FROM yourTable
ORDER BY id;
 

снимок экрана из демонстрационной ссылки ниже


ДЕМОНСТРАЦИЯ

Редактировать:

Чтобы сохранить приведенный выше выбор в новой таблице, используйте:

 SELECT (id, [key], name, salary, location, start_date,
        end_date, isactive) INTO yourNewTable
FROM (
    -- the exact select from above
) t;
 

Комментарии:

1. Сэр, я хочу сохранить эту таблицу также, как эта таблица будет сохранена???

2. @Street Используйте select into, см. мой обновленный ответ выше.