Skip to main content

SCD using date- Derive Effective From and Effective To Date using SQL

We can able to maintain old historical and current data (SCD) using the date column. Let me show you people how to write a small query to achieve it.

For example, Assume we have a column called currency which has currency values of all the countries and your business needs it to keep it uniform, say convert all currency of different countries to USD, so it will be easy for Business judgement and analysis.

For this, let me take an example of Yahoo! Finance. Yahoo! Finance API provides us currency conversion of all country based on time. I am not here going to tell how to pull the data from Yahoo! Finance API, But I am using such data which I pulled to explain how SCD can be achieved.

Below is a image, which depicts, the data which we got from Yahoo! Finance.


We wanted this to get converted as shown below:


Where we wanted to derive Effective_To column, which indicates, from one date to other date, the currency was so & so for a country against USD.

We can achieve this using Row_Number(). (Remember, we have built in Function in SQL Server from 2012 onwards to achieve the same)
Because, I am working on SQL Server 2008, this may help few people and below is query to do that.

SELECT From_Currency
      ,To_Currency
      ,Effective_From
      ,Exchange_Rate
      ,Row_Number() OVER (
            PARTITION BY From_Currency ORDER BY Effective_Date DESC
            )  AS RnkNxt
INTO #TEMP1
FROM Yahoo_Exchange_Rate

SELECT From_Currency
      ,To_Currency
      ,Effective_From
      ,Exchange_Rate
      ,Row_Number() OVER (
            PARTITION BY From_Currency ORDER BY Effective_Date DESC
            ) + 1 AS RnkNxt
INTO #TEMP2
FROM Yahoo_Exchange_Rate

SELECT Distinct O.From_Currency
      ,O.To_Currency
      ,Cast(Effective_Date As Datetime) As Effective_From
      ,Cast(Exchange_Rate As Decimal(15,8)) As Exchange_Rate
      ,(
            SELECT DateAdd(dd, - 1, Effective_Date)
            FROM #Temp1 T
            WHERE T.RnkNxt = O.Rnk
                  AND T.From_Currency = O.From_Currency
            ) AS Effective_To
FROM #TEMP2 O


Comments

Popular posts from this blog

Zip/Unzip multiple files and also include password for zipped file using SSIS

We have many scenario that we need to Zip many files which we come across and then so some operations like either sending it as a email or just moving zipped file to some other destinations etc. But we were using manual method to zip multiple files. In this post, I tried to create a package which will zip multiple files using SSIS. Here for Zipping files purpose, I'm using 7-ZIP which is free software available in google sites. Download files and install onto your system. First let me show how to Zip on file and later I will show how to zip multiple files using SSIS and 7Zip tool. Compressing Single file. Here I'm trying to Zip one single flat file which is of 40MB size. I kept this file in C:\Documents and Settings\\Desktop\test\source folder. Now to compress this file, I will open my SSIS and I'm dragging and dropping EXECUTE PROCESS TASK from Control Flow. Now right click on Execute Process task and go for edit and select Process option. In process tab,

SSIS: The Value Was Too Large To Fit In The Output Column

I had a SSIS package where I was calling a stored procedure in OLEDB Source and it was returning a “The Value Was Too Large to Fit in the Output Column” error. Well, My Datatype in OLEDB source was matching with my OLEDB Destination table. However, when I googled, we got solutions like to increase the output of OLEDB Source using Advanced Editor option . I was not at all comfortable with their solution as my source, destination and my intermediate transformation all are having same length and data type and I don’t want to change. Then I found that I was missing SET NOCOUNT ON option was missing in Stored Procedure. Once I added it, my data flow task ran successfully. 

How to move multiple files in ssis and also rename simultaneously

There are two ways to achieve this. 1) We can move the flat files and then rename it. 2) While moving files itself, automatic rename should be done. We will do the second type. The criteria is to rename the files while moving from source to destination. So for that, we need FILE SYSTEM TASK to be included. Secondly since we need to move many files, we will use FOR EACH LOOP CONTAINER. To fetch all the files, we can use FOR EACH LOOP task in SSIS. In collection tab, we can select FOREACH FILE enumerator option for fetching files and we can change enumerator configuration Folder option: Points to source where we need to fetch files. Files: will give us idea whether we need to fetch all the files (*.*) or if we give extension like *.txt, it is going to fetch only  .txt files . Once I give Source name in FOR EACH LOOP container, It is going to fetch all the files corresponding to that path. Retrieve file name: This option is used to let the variables mentioned in VARIA