dataform-scd icon indicating copy to clipboard operation
dataform-scd copied to clipboard

Hash value comparison: new record is not loaded, if the same hash value exist in older record.

Open nnikolov84 opened this issue 1 year ago • 5 comments

When using hash value comparison, new record is not loaded, if the same hash value exist in older record.

Input data:

CUSTOMER_ID CUSTOMER_ADDRESS UPDATE_ON Comment
1 "ADDRESS_1" 1/1/2000 Initial address.
1 "ADDRESS_2" 1/20/2000 Customer changed address.
1 "ADDRESS_1" 1/22/2000 Customer changed back the address to the value from line 1.

The third value in the table will not be processed. This is happening, because when generating "ids_to_update", the historical records are not filtered.

with ids_to_update as 
   (select col1, HASH_COLUMN from `....TEST.TEST_TABLE_SRC_01`        
     except distinct         
   (select col1, HASH_COLUMN from `....TEST.source_data_scd_updates`)

In order for the process to work properly, only most recent record per KEY should be compared to the input data. Possible solution is:

with ids_to_update as 
   (select col1, HASH_COLUMN from `....TEST.TEST_TABLE_SRC_01`        
     except distinct         
   (select col1, HASH_COLUMN from `....TEST.source_data_scd_updates`
      qualify row_number() over (partition by col1 order by updated_at desc) = 1)

nnikolov84 avatar Apr 17 '24 09:04 nnikolov84

if your source table had unique records and it updated the record with new hash, will it be still an issue?

denziljoseph avatar Jul 16 '24 12:07 denziljoseph

if your source table had unique records and it updated the record with new hash, will it be still an issue?

I'm not sure I understand what you mean. The data coming from the source is unique, but off course it is changing from delivery to delivery. This being SCD, it should show how a record changed in time, but it fails to do so, if a value was already delivered in the past. *see the table my first comment.

nnikolov84 avatar Jul 26 '24 07:07 nnikolov84

In addition to your input data you need to have an incremental model with customer_id as unique key. And this new incremental model should be the source to your scd.

denziljoseph avatar Jul 30 '24 16:07 denziljoseph

@nnikolov84 is correct. Take this example That's the source table. image

And this is the output after calling scd. image As you can see, the new row is not shown in the output table because the hash value from the last row is exactly the same as the hash from the second row.

Liscor avatar Sep 09 '24 15:09 Liscor

any idea on when this may be included into the main branch? (@Ekrekr?)

Mats-Elfving avatar Nov 18 '24 07:11 Mats-Elfving