I have 100s of excel sheets(CSV files) I need to use for the historical load. I am going to load all the CSVs to a stage table using ETL.
I am trying to get the row-wise value from the cell for similar rows. Please see the snapshot in the link.
Here is a sample creation of table script, else please refer to above link for full sample data
DROP TABLE #c
CREATE TABLE #C (col varchar(255) ,rowid int,col1 varchar(255))
INSERT INTO #C values('Wednesday, March 06, 2019 - Weather: TY: 15‹C', 1,NULL)
INSERT INTO #C values('a', 2,NULL)
INSERT INTO #C values('b', 3,NULL)
INSERT INTO #C values('c', 4,NULL)
INSERT INTO #C values('Thursday, March 07, 2019 - Weather: TY: 12‹C', 5,NULL)
INSERT INTO #C values('a', 6,NULL)
INSERT INTO #C values('b', 7,NULL)
INSERT INTO #C values('c', 8,NULL)
INSERT INTO #C values('Friday, March 08, 2019 - Weather: TY: 12‹C', 9,NULL)
INSERT INTO #C values('a', 10,NULL)
INSERT INTO #C values('b', 11,NULL)
INSERT INTO #C values('c', 12,NULL)
snapshot of the output here: black tick is correct, red crosses are wrong
I got the 1st three sections correct but others I got wrong. the red cross sections are wrong as I need to get the date in the row section.
ALTER TABLE dbo.[sql GET VALUES] ADD rowId INT IDENTITY(1, 1)
ALTER TABLE dbo.[sql GET VALUES] ADD RequiredColumn VARCHAR(255) NULL
UPDATE a
SET requiredColumn = column1
FROM dbo.[sql GET VALUES] a
WHERE column1 LIKE '%Sunday%'
OR column1 LIKE '%Monday%'
OR column1 LIKE '%tuesday%'
OR column1 LIKE '%wednesday%'
OR column1 LIKE '%thursday%'
OR column1 LIKE '%friday%'
OR column1 LIKE '%saturday%'
IF OBJECT_ID('Tempdb.dbo.#temptable') IS NOT NULL
BEGIN
DROP TABLE tempdb.dbo.#temptable
END
SELECT rowID,
CASE
WHEN CONVERT(VARCHAR(255), requiredcolumn) IS NOT NULL THEN
CONVERT(VARCHAR(255), requiredcolumn)
ELSE
(
SELECT MAX(requiredcolumn)
FROM dbo.[sql GET VALUES]
WHERE rowID <= t.rowID - 1
)
END AS requiredcolumn
INTO #temptable
FROM dbo.[sql GET VALUES] t
UPDATE a
SET a.requiredcolumn = i.requiredcolumn
-- select a.requiredcolumn, i.requiredcolumn,*
FROM #temptable i
INNER JOIN dbo.[sql GET VALUES] a
ON i.rowID = a.rowID
SELECT *
FROM [sql GET VALUES]
I need to get the date info to the row for each row with date value along the column.
Advertisement
Answer
Using a CTE and a double use of the window function for MAX works for this.
And then it can be done in 1 update statement.
In the SQL, the first MAX
calculates the highest previous/current Id with a valid column1 value.
The second MAX
uses that calculated id to get the valid column1 value.
Sample data:
IF OBJECT_ID('tempdb..#C', 'U') IS NOT NULL DROP TABLE #C;
CREATE TABLE #C (rowid int primary key identity(1,1), column1 VARCHAR(255), RequiredColumn VARCHAR(255));
insert into #C (column1) values
('Wednesday, March 06, 2019 - Weather: TY: 15‹C'),
('a'),
('b'),
('c'),
('Thursday, March 07, 2019 - Weather: TY: 12‹C'),
('d'),
('e'),
('f'),
('Friday, March 08, 2019 - Weather: TY: 12‹C'),
('g'),
('h'),
('i');
Update & select
;WITH CTE AS
(
select *,
max(case when rowid = MaxPrevId then column1 end) over (partition by MaxPrevId) as column1calc
from
(
select rowid, column1, RequiredColumn,
max(case
when column1 LIKE '%sunday%'
OR column1 LIKE '%monday%'
OR column1 LIKE '%tuesday%'
OR column1 LIKE '%wednesday%'
OR column1 LIKE '%thursday%'
OR column1 LIKE '%friday%'
OR column1 LIKE '%saturday%'
then rowid
end) over (order by rowid ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as MaxPrevId
from #C
) q
)
UPDATE CTE
SET RequiredColumn = column1calc;
select rowid, RequiredColumn
from #C
order by rowid;
Returns:
rowid RequiredColumn
1 Wednesday, March 06, 2019 - Weather: TY: 15‹C
2 Wednesday, March 06, 2019 - Weather: TY: 15‹C
3 Wednesday, March 06, 2019 - Weather: TY: 15‹C
4 Wednesday, March 06, 2019 - Weather: TY: 15‹C
5 Thursday, March 07, 2019 - Weather: TY: 12‹C
6 Thursday, March 07, 2019 - Weather: TY: 12‹C
7 Thursday, March 07, 2019 - Weather: TY: 12‹C
8 Thursday, March 07, 2019 - Weather: TY: 12‹C
9 Friday, March 08, 2019 - Weather: TY: 12‹C
10 Friday, March 08, 2019 - Weather: TY: 12‹C
11 Friday, March 08, 2019 - Weather: TY: 12‹C
12 Friday, March 08, 2019 - Weather: TY: 12‹C