|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
версия сервера Код: sql 1.
Есть таблица , которая хранится в виде SCD 2 , и она каждый день обновляется. Хочу настроить , чтобы при обновлении запись правильно закрывалась. дата = 01.01.1980 - это с начала времен, дата = 01.01.2079 - это значит запись действует по текущее время Если по одному id пришла запись, то значит предшествующую запись закрываем предыдущим днем от даты начала новой записи, если и старая запись и новая запись действовали по текущее время, то старую запись (src=0) закрываем текущим днем, а новую открываем завтрашним. Новая запись (src=1) считается главной, если придут перекрывающие условия. Ключ таблицы , id + dt_to Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48.
Исходя из контрольного примера, нужно получить таблицу вида: id valdt_from dt_to1501.05.202031.05.20201601.06.202030.06.20201701.07.202031.07.202011201.08.202031.08.20201701.09.202031.10.20201501.11.202031.11.20201201.12.202031.12.20201801.01.202128.02.20211501.03.202131.03.20211801.04.202131.05.20212801.01.198028.01.202221529.01.202201.01.20793901.01.198031.05.20193701.06.201931.10.201931101.11.201931.01.20204101.01.202029.02.20204501.03.202001.01.2079 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 11:12 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
Предлагаешь научить тебя пользоваться merge? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 12:41 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
Ах да, чуть не забыл. Если ты откажешься от глупого желания иметь dt_to - ваще ничего делать не надо. Ну а если желание иметь dt_to неизбывно - LEAD() OVER(partition by id order by dt_from) спасет отца русской демократии. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 12:56 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
aleks222, без dt_to не обойтись. Если обратите внимание, то срок действия у каждого значения бывает разный. А если значение одно, то без него точно не обойтись. LAG, LEAD знаю, я даже уже написал скрипт, но он не срабатывает для некоторых случаев. Могу его привести тут. Скрипт немного перекрученный. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104.
Поэтому написал сюда, может кто поможет его докрутить. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 13:47 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
minya13_85, date_to можно не хранить, т.к. это избыточно при указанных требованиях. В таблицу вставляете новые записи с датой начала, а дату закрытия - вычисляете. можно использовать LEAD() или что-то ещё. Просто посмотрите под другим углом, не привязывайтесь к императивной логике. "закрываем текущим днем, а новую открываем завтрашним", это императивное описание, на самом деле "открываем и закрываем" - это условности. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 14:23 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
Владислав Колосов date_to можно не хранить, т.к. это избыточно при указанных требованиях. В таблицу вставляете новые записи с датой начала, а дату закрытия - вычисляете. можно использовать LEAD() или что-то ещё. А как быть со строками вот даже на примере. Значение 11 для id=3 существовало с начала времен до 31.01.2020 idvaldt_fromdt_tosrc31101.01.198031.01.20200 потом пришли новые значения для Id=3, что оказывается с начала времен было значение не 11, а 9 и оно действовало до 31.05.2019 и потом оно перешло в значение 7 , с 01.06.2019-31.10.2019, и только потом приняло значение 11. id valdt_fromdt_tosrc3901.01.198031.05.201913701.06.201931.10.20191 Если я отброшу dt_to, то как я пойму срок действия и с какого числа начать запись для значения 11, с учетом того, какие значения пришли. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 14:49 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
"закрываем текущим днем, а новую открываем завтрашним", это императивное описание Просто интересно, как это будет звучать на НЕ императивном описании? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 14:55 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
minya13_85 aleks222, без dt_to не обойтись. Если обратите внимание, то срок действия у каждого значения бывает разный. А если значение одно, то без него точно не обойтись. LAG, LEAD знаю, я даже уже написал скрипт, но он не срабатывает для некоторых случаев. Могу его привести тут. Скрипт немного перекрученный. Поэтому написал сюда, может кто поможет его докрутить. Если знаешь про LAG LEAD зачем вообще держишь поле dt_to. Почему не оставить только dt_from, а dt_to не получать LEADом ? . ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 15:14 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
Wlr-l "закрываем текущим днем, а новую открываем завтрашним", это императивное описание Просто интересно, как это будет звучать на НЕ императивном описании? На неимперативном: 1. есть дата НАЧАЛА 2. ДАТА КОНЦА = дата следующего НАЧАЛА - 1. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 15:29 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
[quot a_voronin#22427425] minya13_85 Если знаешь про LAG LEAD зачем вообще держишь поле dt_to. Почему не оставить только dt_from, а dt_to не получать LEADом ? . Прочтите мои посты выше с примерами. Если можете написать без dt_to подскажите как? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 15:30 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 15:43 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
ТС сказал, что они используют SCD2. Возможно, просто так захотели и все. SCD2 предполагает хранение исторических данных вместе со служебной информацией, которая отвечает за версионность, статус, временной интервал, в течение которого данные строки являются актуальными, и может быть еще за что-то. Для чего придумаkи эти сложности? Запись новых и изменение имеющихся данных это редкие события, а вот читать эти данные бывает нужно часто и много раз. Что важнее, один раз вычислить dt_to и потом его использовать много-много раз или отказаться от него и вычислять его каждый раз из много-много раз? Кстати случаи с dt_to и без него подходят под определение SCD2. Это как золотое правило механики (вспомним школу, а не забудем все то, чему нас учили): нельзя одновременно выиграть в силе и расстоянии. ТС хочет выиграть в силе, а ему предлагают выиграть в расстоянии. В.Колосов назвал это желание императивизмом. aleks222 продолжил: На неимперативном: 1. есть дата НАЧАЛА 2. ДАТА КОНЦА = дата следующего НАЧАЛА - 1. <-- императивщина Так это "закрываем предыдущим днем, а новую открываем текущим". Так что тема неимперативщины не раскрыта. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 15:55 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
a_voronin minya13_85 aleks222, без dt_to не обойтись. Если обратите внимание, то срок действия у каждого значения бывает разный. А если значение одно, то без него точно не обойтись. LAG, LEAD знаю, я даже уже написал скрипт, но он не срабатывает для некоторых случаев. Могу его привести тут. Скрипт немного перекрученный. Поэтому написал сюда, может кто поможет его докрутить. Если знаешь про LAG LEAD зачем вообще держишь поле dt_to. Почему не оставить только dt_from, а dt_to не получать LEADом ? . Например, из соображений перформанса ну и дабы дать ссылку на "стандартную" реализацию всяких таблиц с версиями записи https://docs.microsoft.com/ru-ru/sql/relational-databases/tables/temporal-tables?view=sql-server-ver15 там как раз from и to в каждой строке. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 16:04 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
minya13_85, авторпотом пришли новые значения для Id=3 В этом случае Вы некорректно представили данные, поскольку записи в таблице неразличимы. В случае, если требуется иметь строгую последовательность событий, эти события должны быть различимы и установлен их порядок. То есть должен существовать ключ. При вставке новых данных они автоматически займут свое место и проблем с определением даты окончания не будет. Если атрибут val и dt_from входят в состав ключа, то проблем с определением даты следующей по порядку даты не будет. Скорее всего, ключ должен состоять из dt_from, val. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 18:55 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
Wlr-l, авторТак это "закрываем предыдущим днем, а новую открываем текущим" База данных не имеет таких понятий, как "закрыть", "новую открыть". Это алгоритмическое описание. В базу можно вставить, удалить, обновить. В данном случае, чтобы выполнить оба этих действия "закрыть" и "новую открыть", достаточно выполнить вставку новой записи. То есть действия "закрыть" и "открыть" не будут выполнены, они не требуются. А вот если реализовать "в лоб", как написано, потребуется создать специальные процедуры, которые, к тому же, должны обеспечить атомарность "закрытия" и "открытия" при последовательном, как написано буквально, выполнении. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 19:01 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
Владислав Колосов Скорее всего, ключ должен состоять из dt_from, val. С какого бодуна значение должно входить в ключ? Новая реляционная тиория? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 19:37 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
Владислав Колосов Wlr-l, База данных не имеет таких понятий, как "закрыть", "новую открыть". Это алгоритмическое описание. В базу можно вставить, удалить, обновить. В данном случае, чтобы выполнить оба этих действия "закрыть" и "новую открыть", достаточно выполнить вставку новой записи. То есть действия "закрыть" и "открыть" не будут выполнены, они не требуются. А вот если реализовать "в лоб", как написано, потребуется создать специальные процедуры, которые, к тому же, должны обеспечить атомарность "закрытия" и "открытия" при последовательном, как написано буквально, выполнении. Если я непонятно объяснил что-то в сообщении ( 22427453 ), из которого вы взяли одну фразу, то начните отсюда https://ru.wikipedia.org/wiki/Медленно_меняющееся_измерение По поводу вашего сообщения 22427535 , помните у Маяковского: Ужас из железа выжал стон! По разработчикам баз данных прошло рыданье! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 20:24 |
|
slowly changing dimensions type 2
|
|||
---|---|---|---|
#18+
minya13_85 Владислав Колосов date_to можно не хранить, т.к. это избыточно при указанных требованиях. В таблицу вставляете новые записи с датой начала, а дату закрытия - вычисляете. можно использовать LEAD() или что-то ещё. А как быть со строками вот даже на примере. Значение 11 для id=3 существовало с начала времен до 31.01.2020 idvaldt_fromdt_tosrc31101.01.198031.01.20200 потом пришли новые значения для Id=3, что оказывается с начала времен было значение не 11, а 9 и оно действовало до 31.05.2019 и потом оно перешло в значение 7 , с 01.06.2019-31.10.2019, и только потом приняло значение 11. id valdt_fromdt_tosrc3901.01.198031.05.201913701.06.201931.10.20191 Если я отброшу dt_to, то как я пойму срок действия и с какого числа начать запись для значения 11, с учетом того, какие значения пришли. minya13_85 Владислав Колосов date_to можно не хранить, т.к. это избыточно при указанных требованиях. В таблицу вставляете новые записи с датой начала, а дату закрытия - вычисляете. можно использовать LEAD() или что-то ещё. А как быть со строками вот даже на примере. Значение 11 для id=3 существовало с начала времен до 31.01.2020 idvaldt_fromdt_tosrc31101.01.198031.01.20200 потом пришли новые значения для Id=3, что оказывается с начала времен было значение не 11, а 9 и оно действовало до 31.05.2019 и потом оно перешло в значение 7 , с 01.06.2019-31.10.2019, и только потом приняло значение 11. id valdt_fromdt_tosrc3901.01.198031.05.201913701.06.201931.10.20191 Если я отброшу dt_to, то как я пойму срок действия и с какого числа начать запись для значения 11, с учетом того, какие значения пришли. У тя, страдалец, банальная задача ликвидации перекрытий интервалов. Делается это как-то так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 20:29 |
|
|
start [/forum/topic.php?fid=46&fpage=4&tid=1683886]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
77ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 204ms |
0 / 0 |