Дизайн базы данных для исторической таблицы

У меня есть таблица работодателей (Таблица А). Я хочу создать аналогичную таблицу с дополнительным столбцом даты (таблица B), показывающим дату вставки строк. Я хочу вставлять строки из таблицы A в новую таблицу в конце каждого месяца. Есть ли способ автоматизировать это в SQL?

Я слышал, что вы можете сделать это с помощью хранимых процедур, но у меня нет опыта их использования, и я буду очень признателен за любые рекомендации.

Вот как может выглядеть таблица:

MemberID First Last   Department Salary Daily_Hours Active_Flag
100      Evan  Turner Sales      75000  8           1
200      Ron   Gold   Marketing  80000  9           1
300      Bob   Gun    HR         50000  8           1

Желаемый результат:

ID MemberID First Last   Department Salary Daily_Hours Active_Flag Date
1  100      Evan  Turner Sales      75000  8           1           3/31/19
2  200      Ron   Gold   Marketing  80000  9           1           3/31/19
3  300      Bob   Gun    HR         50000  8           1           3/31/19
4  100      Evan  Turner Sales      75000  8           1           4/30/19
5  200      Ron   Gold   Marketing  80000  9           1           4/30/19
6  300      Bob   Gun    HR         50000  8           1           4/30/19
7  100      Evan  Turner Finance    95000  8           1           5/31/19
8  200      Ron   Gold   Marketing  80000  9           1           5/31/19
9  300      Bob   Gun    HR         60000  8           1           5/31/19

Обратите внимание, как Эван Тернер сменил отдел и получил повышение зарплаты в мае месяце. Боб также получил прибавку к зарплате в том же месяце.

Идея состоит в том, что таблица A обновляется один раз в месяц, и я хочу записать это изменение в новую таблицу.

Вы спрашиваете, как написать insert или как запланировать такое?

JohnHC 30.05.2019 15:27

С точки зрения дизайна это не лучшее решение. Я бы посоветовал вам использовать дату VALID_FROM и VALID_TO и добавлять новую строку (и обновлять предыдущую) только в случае изменения. Затем вы можете настроить триггер на базовой таблице для автоматического выполнения работы (планирование не требуется).

JohnHC 30.05.2019 15:30

Похоже, вы хотите использовать темпоральные таблицы.

S3S 30.05.2019 15:46
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
115
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете создать процедуру, как показано ниже, и запланировать ее каждый конец месяца.

CREATE PROCEDURE usp_InsertHistory
AS
BEGIN

IF CAST(GETDATE() AS DATE) = CAST(EOMONTH(GETDATE()) AS DATE)

BEGIN

INSERT INTO HistoryTable
(
  Id
  ,MemberId
  ,First
  ,Last
  ,Department
  ,Salary
  ,Daily_Hours
  ,Active_Flag
  ,Date
)
SELECT   Id
  ,MemberId
  ,First
  ,Last
  ,Department
  ,Salary
  ,Daily_Hours
  ,Active_Flag
  ,GETDATE()
FROM Table

END

END 

ТРИГГЕР был бы намного лучше! (имеют большую добавленную стоимость)

Luuk 30.05.2019 15:49

да. Но первоначальные ожидания состоят в том, чтобы сохранять полный набор данных в конце каждого месяца. Я бы более чем согласился на триггер в случае только отслеживания изменений, а не полного набора

Dheerendra 30.05.2019 15:52

Спасибо @Dheerendra. Это то, чего я хочу. Изначально я начал с триггера для записи изменений, но если кто-то из моей команды ошибется и сделает два обновления в одних и тех же строках, то мы можем получить две записи за один и тот же месяц, а это не то, что мне нужно. Меня интересует только полный набор изменений

AGuyHasNoName 30.05.2019 16:02

убедившись, что у вас есть все изменения (через ТРИГГЕР), вы также получите полный набор в конце месяца.

Luuk 30.05.2019 16:02

@Luuk Ты прав. Дело в том, что мне нужна только одна запись для каждого работодателя каждый месяц, потому что мне нужна эта таблица, чтобы получать другую статистику из других таблиц. Наличие нескольких записей для одного и того же работодателя в одном и том же месяце добавило бы ненужных дубликатов.

AGuyHasNoName 30.05.2019 16:09

Ваша таблица истории будет расти «быстро» со строками, которые также существуют в вашей таблице работодателей. Триггер также может сходить с ума, чтобы обновить запись, если она уже существует в течение определенного месяца, оставив вам максимум 1 запись на сотрудника в месяц и 0 записей для сотрудников без мутаций в этом месяце.

Luuk 30.05.2019 16:22

Добавьте новый столбец, который записывает, когда вставляется строка:

alter table t add column createdAt datetime default getdate();

Это будет автоматически заполнено датой вставки (продвижение вперед).

Другие вопросы по теме