Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

SCD loại 6

Dữ liệu về chiều thay đổi chậm hoặc không thể đoán trước được sẽ được ghi lại trong phân tích Kích thước thay đổi chậm (SCD). Trong môi trường kho dữ liệu, bảng thứ nguyên có khóa chính xác định duy nhất từng bản ghi và các phần thông tin khác được gọi là dữ liệu thứ nguyên.

Tất cả các phương pháp cập nhật cho các loại SCD khác nhau có thể được thực hiện bằng cách sử dụng chương trình SortCL trong IRI CoSort. Trong IRI Voracity có một trình hướng dẫn để hỗ trợ tạo các tập lệnh công việc SCD được sử dụng khi chạy chương trình SortCL. Hầu hết các biến thể sử dụng một phép nối bên ngoài đầy đủ để khớp các bản ghi từ nguồn dữ liệu ban đầu với các bản ghi trong nguồn được cập nhật dựa trên việc cân bằng một khóa từ mỗi. Bản ghi trong nguồn cập nhật không khớp cần được thêm vào bản chính.

Dưới đây là tổng quan về cách cập nhật tệp hoặc bảng kích thước bằng cách sử dụng SCD Loại 6 mà tôi đang duy trì chi phí sản phẩm. Quá trình cập nhật được thực hiện bằng cách kết hợp với trường Mã sản phẩm .

Loại 6 SCD

Loại 6 là phép lai là sự kết hợp của Loại 1, Loại 2 và Loại 3. Nó được gọi là Loại 6 vì 1 + 2 + 3 =6. Mỗi bản ghi sẽ có các trường sau:

  • Mã sản phẩm :Đây là trường khóa định danh.
  • Chi phí :Giá thành hiện tại của sản phẩm.
  • Chi phí Lịch sử :Chi phí có hiệu lực trên Ngày bắt đầu cho hồ sơ đó.
  • Ngày bắt đầu :Ngày Chi phí lịch sử có hiệu lực.
  • Ngày kết thúc :Ngày mà Chi phí Lịch sử cho bản ghi không còn là Chi phí Hiện tại nữa. Nếu Chi phí lịch sử vẫn là Chi phí hiện tại, thì Ngày kết thúc là 99991231.
  • Hiện tại :Y nếu Chi phí vẫn hiện tại, N nếu không

Bây giờ, chúng ta hãy chỉ xem xét các bản ghi cho Mã sản phẩm J245. Hãy bắt đầu khi Chi phí lịch sử sớm nhất là Chi phí hiện tại. Chi phí Lịch sử giống như Chi phí. Sau đó, có một bản ghi cho Mã sản phẩm J245 và nó có các giá trị được hiển thị bên dưới:

Mã sản phẩm Chi phí Chi phí Lịch sử Ngày Bắt đầu Ngày kết thúc Hiện tại
J245 385,25 385,25 20100215 99991231

Khi một Chi phí mới cần được triển khai, các giá trị trong bản ghi cập nhật được sử dụng để thêm bản ghi hiện tại mới. Chi phí hiện tại trong tất cả các bản ghi có Mã sản phẩm J245 sẽ được thay đổi thành Chi phí giá trị từ bản ghi cập nhật trong khi Chi phí lịch sử giữ nguyên cho các bản ghi hiện có. Ngoài ra, Ngày kết thúc đối với bản ghi hiện tại cũ được thay đổi thành Ngày bắt đầu cho bản ghi hiện tại mới. Trong hồ sơ có Mã sản phẩm J245, Chi phí hiện tại trường trong tệp Chính được cập nhật hiện có các giá trị dưới đây:

Mã sản phẩm Chi phí Chi phí Lịch sử Ngày Bắt đầu Ngày kết thúc Hiện tại
J245 425,25 425,25 20101001 99991231
J245 425,25 385,25 20100215 20101001 N

Bây giờ chúng tôi sẽ cập nhật chi phí mới tiếp theo và nhận các giá trị sau cho các bản ghi J245:

Mã sản phẩm Chi phí Chi phí Lịch sử Ngày Bắt đầu Ngày kết thúc Hiện tại
J245 450.50 450.50 20110430 99991231
J245 450.50 425,25 20101001 20110430 N
J245 450.50 385,25 20100215 20101001 N

Bản cập nhật cuối cùng tạo ra các bản ghi có các giá trị sau:

Mã sản phẩm Chi phí Chi phí Lịch sử Ngày Bắt đầu Ngày kết thúc Hiện tại
J245 550.50 550.50 20120701 99991231
J245 550.50 450.50 20110430 20120701 N
J245 550.50 425,25 20101001 20110430 N
J245 550.50 385,25 20100215 20101001 N

Dưới đây là các giá trị trong tệp chính trước khi cập nhật:

Mã sản phẩm Chi phí Chi phí Lịch sử Ngày Bắt đầu Ngày kết thúc Hiện tại
C123 125,50 125,50 20110228 99991231
F112 2365,00 2365,00 20120101 99991231
G101 19,25 19,25 20110930 99991231
G101 19,25 21,25 20110501 20110930 N
J245 450.50 450.50 20110430 99991231
J245 450.50 425,25 20101001 20110430 N
J245 450.50 385,25 20100215 20101001 N
S022 98,75 98,75 20110515 99991231

Tất cả dữ liệu cập nhật sẽ có cùng một Ngày bắt đầu . Nguồn update.dat chứa các giá trị sau:

Mã sản phẩm Chi phí Ngày Bắt đầu
F112 2425,00 20120701
J245 550.50 20120701
M447 101,75 20120701
S022 101,75 20120701

Trong IRI Workbench, có một trình hướng dẫn Voracity để hỗ trợ việc tạo các tập lệnh để cập nhật các tệp và bảng Thứ nguyên. Trình hướng dẫn này nằm trong menu thả xuống Voracity trên thanh điều hướng. Đầu tiên, bạn chọn loại SCD. Sau đó, cửa sổ nơi bạn chọn các nguồn được sử dụng để xử lý bản cập nhật sẽ hiển thị. Đối với Loại 6, đích thường là bảng hoặc tệp chính ban đầu.

Với màn hình tiếp theo, bạn xác định cách dữ liệu cập nhật được ánh xạ và cách các giá trị trường hoặc cột khác được đặt. The update.Cost trường sẽ ánh xạ tới master6.CurrentCost update.StartDate trường sẽ ánh xạ tới master6.StartDate . Trường cờ là trường được sử dụng để xác định xem bản ghi có chứa các giá trị trường gần đây nhất hay không. Trong trường hợp này, trường đó là master6.current . Nếu đó là bản ghi mới nhất, thì Chi phí hiện tại và trường Chi phí lịch sử trường sẽ có các giá trị giống nhau. Giá trị tích cực của cờ là giá trị trong master6.Current xác định rằng các giá trị trường là các giá trị gần đây nhất cho một Mã sản phẩm . Trong trường hợp đó, giá trị là “Y” trong ví dụ của chúng tôi và Giá trị phủ định của cờ là "N". Trường kết thúc chứa tên của trường chứa giá trị được sử dụng để xác định thời điểm Chi phí cho bản ghi không còn hiệu lực và Master.EndDate giữ giá trị đó. Giá trị cuối cùng được sử dụng làm giá trị cho Trường kết thúc khi bản ghi là hiện tại.

Màn hình tiếp theo là để xác định phép nối được thực hiện với nguồn chính và nguồn cập nhật. Bạn nên lưu ý rằng cả hai nguồn phải được sắp xếp theo thứ tự đối với Mã sản phẩm . Nếu không, bạn cần chọn NOT_SORTED trong trình đơn thả xuống cho Tùy chọn sắp xếp thứ tự dưới nguồn dữ liệu cần được sắp xếp.

Đây là kịch bản công việc đầu tiên:

/INFILE=master6.dat
    /PROCESS=DELIMITED
    /ALIAS=master6
    /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
    /FIELD=(CURRENTCOST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"')
    /FIELD=(HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"')
    /FIELD=(STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"')
    /FIELD=(ENDDATE, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"')
    /FIELD=(CURRENT, TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"')
/INFILE=update.dat
    /PROCESS=DELIMITED
    /ALIAS=update
    /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
    /FIELD=(COST, TYPE=ASCII, POSITION=2, SEPARATOR=",", FRAME='\"')
    /FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"')

/JOIN FULL_OUTER NOT_SORTED master6 update WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE

/OUTFILE=master6.dat
# Make changes to records that have the same ProductCode
# as records in the update file 
    /PROCESS=DELIMITED
    /FIELD=(MASTER6.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
    /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"')
    /FIELD=(MASTER6.HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"')
    /FIELD=(MASTER6.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"')
    /FIELD=(ENDDATE_NEW, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"', IF MASTER6.CURRENT EQ "Y" THEN UPDATE.STARTDATE ELSE MASTER6.ENDDATE)
    /FIELD=(CURRENT_NEW="N", TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"')
    /INCLUDE WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE

/OUTFILE=master6.dat
# Keep the records that have no updates 
    /PROCESS=DELIMITED
    /FIELD=(MASTER6.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
    /FIELD=(MASTER6.CURRENTCOST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"')
    /FIELD=(MASTER6.HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"')
    /FIELD=(MASTER6.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"')
    /FIELD=(MASTER6.ENDDATE, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"')
    /FIELD=(MASTER6.CURRENT, TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"')
    /OMIT WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE
    /OMIT WHERE MASTER6.PRODUCTCODE EQ ""

/OUTFILE=master6.dat
# Add the records with new product codes
    /PROCESS=DELIMITED
    /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
    /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"')
    /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"')
    /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"')
    /FIELD=(ENDDATE_NEW="99991231", TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"')
    /FIELD=(CURRENT_NEW="Y", TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"')
    /OMIT WHERE UPDATE.PRODUCTCODE EQ ""
    /INCLUDE WHERE UPDATE.PRODUCTCODE

Để xem lại,

  • Giá trị cho Chi phí hiện tại sẽ giống nhau đối với tất cả các bản ghi có Mã sản phẩm chung
  • Ngày bắt đầu là ngày mà Chi phí lịch sử trở nên hiệu quả
  • Đối với bản ghi mới nhất của Mã sản phẩm,
    • các giá trị cho Chi phí hiện tại Chi phí lịch sử đều giống nhau
    • Ngày kết thúc là 99991231
    • Giá trị tính bằng Hiện tại là Y
  • Đối với các bản ghi không phải là bản ghi hiện tại
    • Ngày kết thúc là ngày Chi phí tiếp theo gần đây hơn trở nên hiệu quả
    • Trường Hiện tại có N cho giá trị

Tệp chính mới sẽ không được sắp xếp vì các bản ghi chính hiện tại mới đã được thêm vào cuối tệp chính sẽ có các giá trị như sau:

Mã sản phẩm Chi phí Chi phí Lịch sử Ngày Bắt đầu Ngày kết thúc Hiện tại
C123 125,50 125,50 20110228 99991231
F112 2425,00 2365,00 20120101 20120701 N
G101 19,25 19,25 20110930 99991231
G101 19,25 21,25 20110501 20110930 N
J245 550.50 450.50 20110430 20120701 N
J245 550.50 425,25 20101001 20110430 N
J245 550.50 385,25 20100215 20101001 N
S022 101,75 98,75 20110515 20120701 N
F112 2425,00 2425,00 20120701 99991231
J245 550.50 550.50 20120701 99991231
M447 139,25 139,25 20120701 99991231
S022 101,75 101,75 20120701 99991231

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng RStudio với Phiên bản Không phải Hệ thống của Trình quản lý Trình điều khiển unixODBC

  2. Giới thiệu về auto_explain:Cách tự động ghi nhật ký các kế hoạch truy vấn Postgres chậm

  3. Sắp xếp thứ tràn đến cấp độ 15.000

  4. Cách đánh số hàng trong SQL

  5. Cách lưu trữ lịch biểu của nhân viên trong cơ sở dữ liệu