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 | Có |
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 | Có |
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 | Có |
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 | Có |
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 | Có |
F112 | 2365,00 | 2365,00 | 20120101 | 99991231 | Có |
G101 | 19,25 | 19,25 | 20110930 | 99991231 | Có |
G101 | 19,25 | 21,25 | 20110501 | 20110930 | N |
J245 | 450.50 | 450.50 | 20110430 | 99991231 | Có |
J245 | 450.50 | 425,25 | 20101001 | 20110430 | N |
J245 | 450.50 | 385,25 | 20100215 | 20101001 | N |
S022 | 98,75 | 98,75 | 20110515 | 99991231 | Có |
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 và 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 và 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 | Có |
F112 | 2425,00 | 2365,00 | 20120101 | 20120701 | N |
G101 | 19,25 | 19,25 | 20110930 | 99991231 | Có |
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 | Có |
J245 | 550.50 | 550.50 | 20120701 | 99991231 | Có |
M447 | 139,25 | 139,25 | 20120701 | 99991231 | Có |
S022 | 101,75 | 101,75 | 20120701 | 99991231 | Có |