#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, см. мой обновленный ответ выше.