Hi Every one,
I need your help to achieve results. Can you please help me any one?
My requirement is get last matched records results for unmatched records.
I mean when matching the Name column with "ABC" then display corresponding records results value(988777) in expected result. else display previous result value. llly, when matching name with ABC then display corresponding records result's value(421).
Similar,
when matching Name column with "Silver" then show corresponding row result's value 2242 and unmatched records's result should be last matched result value 421 for ONC to INC
Can you please provide a select statement to achieve this expected result?
I tried with LAG function but which was return previous result value. So, I couldn't achieve expected result.
While loop also taking more time.
Please provide with simple SQL script.
Thanks in Advance your support.
Herewith attached sample data.
NameTimeStampResultExpected Result
BTC02-09-16 7:00230230
ABC02-09-16 7:00988777988777
CARCO02-09-16 7:000988777
CITI02-09-16 7:00124988777
CF02-09-16 7:002988777
SFG02-09-16 7:00224444988777
GOL02-09-16 7:005457309988777
SIMCO02-09-16 7:0079988393988777
UCL02-09-16 7:001649692988777
Mul02-09-16 7:00992246988777
ABC02-09-16 7:00421421
FUL02-09-16 7:00144421
SEC02-09-16 7:004421
SILVER02-09-16 7:0022422242
ONC02-09-16 7:0014202292242
FUL02-09-16 7:00799922462242
IIF02-09-16 7:0018731822242
LOC02-09-16 7:00799867282242
UCT02-09-16 7:0002242
MOC02-09-16 7:002522242
INC02-09-16 7:001421
October 30, 2019 at 7:18 pm
Please provide your sample data in the form of CREATE TABLE/INSERT statements, if you would like to receive a working solution.
I do not understand what you mean by 'unmatched' here. Why is CARCO's expected result not zero?
The absence of evidence is not evidence of absence
- Martin Rees
The absence of consumable DDL, sample data and desired results is, however, evidence of the absence of my response
- Phil Parkin
October 30, 2019 at 8:10 pm
You haven't given us enough information to provide a solution for you.
Please follow Phil's advice and provide sample data and expected results. It may also help to provide the query you've already tried, because that may fill in some of the gaps.
Drew
J. Drew Allen
Business Intelligence Analyst
Philadelphia, PA
October 31, 2019 at 4:24 am
Hi Dew,
Thank you so much for looking my query.
I meant that matched value should be ABC & SILVER. when name is ABC then show corresponding result else show previous row result.
Here attached the expected result snapshot.
Create table #SampleData (Name varchar(500),Timestamp datetime,Result int)
Insert into #SampleData values('BTC','2016-10-15 08:47:29',230)
Insert into #SampleData values('ABC','2016-09-16 6:14:54',988777)
Insert into #SampleData values('CARCO','2016-09-16 6:14:56',0)
Insert into #SampleData values('CITI','2016-09-16 6:14:56',124)
Insert into #SampleData values('CF','2016-09-16 6:14:58',2)
Insert into #SampleData values('SFG','2016-09-16 6:15:00',224444)
Insert into #SampleData values('GOL','2016-09-16 6:15:02',5457309)
Insert into #SampleData values('SIMCO','2016-09-16 6:15:04',79988393)
Insert into #SampleData values('UCL','2016-09-16 6:15:06',1649692)
Insert into #SampleData values('Mul','2016-09-16 6:15:08',992246)
Insert into #SampleData values('ABC','2016-09-16 6:15:10',421)
Insert into #SampleData values('FUL','2016-09-16 6:15:12',144)
Insert into #SampleData values('SILVER','2016-09-16 6:15:14',2242)
Insert into #SampleData values('ONC','2016-09-16 6:15:18',1420229)
Insert into #SampleData values('FUL','2016-09-16 6:15:20',79992246)
Insert into #SampleData values('IIF','2016-09-16 6:15:22',1873182)
Insert into #SampleData values('LOC','2016-09-16 6:15:22',79986728)
Insert into #SampleData values('UCT','2016-09-16 6:15:24',0)
Insert into #SampleData values('MOC','2016-09-16 6:15:26',252)
Insert into #SampleData values('INC','2016-09-16 6:15:31',1)
October 31, 2019 at 4:28 am
Hi Allen,
Thank you so much for looking my query.
There is available timestamp is as primary and use it for order by.
Herewith attached sample query for create table and insert data. Also, expected result. I hope it may help you to understand my query.
kindly let me know if you have any concern.
Create table #SampleData (Name varchar(500),Timestamp datetime,Result int)
Insert into #SampleData values('BTC','2016-10-15 08:47:29',230)
Insert into #SampleData values('ABC','2016-09-16 6:14:54',988777)
Insert into #SampleData values('CARCO','2016-09-16 6:14:56',0)
Insert into #SampleData values('CITI','2016-09-16 6:14:56',124)
Insert into #SampleData values('CF','2016-09-16 6:14:58',2)
Insert into #SampleData values('SFG','2016-09-16 6:15:00',224444)
Insert into #SampleData values('GOL','2016-09-16 6:15:02',5457309)
Insert into #SampleData values('SIMCO','2016-09-16 6:15:04',79988393)
Insert into #SampleData values('UCL','2016-09-16 6:15:06',1649692)
Insert into #SampleData values('Mul','2016-09-16 6:15:08',992246)
Insert into #SampleData values('ABC','2016-09-16 6:15:10',421)
Insert into #SampleData values('FUL','2016-09-16 6:15:12',144)
Insert into #SampleData values('SILVER','2016-09-16 6:15:14',2242)
Insert into #SampleData values('ONC','2016-09-16 6:15:18',1420229)
Insert into #SampleData values('FUL','2016-09-16 6:15:20',79992246)
Insert into #SampleData values('IIF','2016-09-16 6:15:22',1873182)
Insert into #SampleData values('LOC','2016-09-16 6:15:22',79986728)
Insert into #SampleData values('UCT','2016-09-16 6:15:24',0)
Insert into #SampleData values('MOC','2016-09-16 6:15:26',252)
Insert into #SampleData values('INC','2016-09-16 6:15:31',1)
Create table #SampleData (Name varchar(500),Timestamp datetime,Result int)
Insert into #SampleData values('BTC','2016-10-15 08:47:29',230)
Insert into #SampleData values('ABC','2016-09-16 6:14:54',988777)
Insert into #SampleData values('CARCO','2016-09-16 6:14:56',0)
Insert into #SampleData values('CITI','2016-09-16 6:14:56',124)
Insert into #SampleData values('CF','2016-09-16 6:14:58',2)
Insert into #SampleData values('SFG','2016-09-16 6:15:00',224444)
Insert into #SampleData values('GOL','2016-09-16 6:15:02',5457309)
Insert into #SampleData values('SIMCO','2016-09-16 6:15:04',79988393)
Insert into #SampleData values('UCL','2016-09-16 6:15:06',1649692)
Insert into #SampleData values('Mul','2016-09-16 6:15:08',992246)
Insert into #SampleData values('ABC','2016-09-16 6:15:10',421)
Insert into #SampleData values('FUL','2016-09-16 6:15:12',144)
Insert into #SampleData values('SILVER','2016-09-16 6:15:14',2242)
Insert into #SampleData values('ONC','2016-09-16 6:15:18',1420229)
Insert into #SampleData values('FUL','2016-09-16 6:15:20',79992246)
Insert into #SampleData values('IIF','2016-09-16 6:15:22',1873182)
Insert into #SampleData values('LOC','2016-09-16 6:15:22',79986728)
Insert into #SampleData values('UCT','2016-09-16 6:15:24',0)
Insert into #SampleData values('MOC','2016-09-16 6:15:26',252)
Insert into #SampleData values('INC','2016-09-16 6:15:31',1)
October 31, 2019 at 4:29 am
Hi Allen,
I have missed to attach Expected result in previous post. So, again attached for your reference.
October 31, 2019 at 4:35 am
Hi Parkin,
Thank you so much for looking my query.
I meant that matched value should be ABC & SILVER. when name is ABC then show corresponding result else show previous row result.
sample expression given below as excel
=IF(($A2=ABC,$D2,$D1)
=IF(($A12=SILVER,$D12,$D11)
Create table #SampleData (Name varchar(500),Timestamp datetime,Result int)
Insert into #SampleData values('BTC','2016-10-15 08:47:29',230)
Insert into #SampleData values('ABC','2016-09-16 6:14:54',988777)
Insert into #SampleData values('CARCO','2016-09-16 6:14:56',0)
Insert into #SampleData values('CITI','2016-09-16 6:14:56',124)
Insert into #SampleData values('CF','2016-09-16 6:14:58',2)
Insert into #SampleData values('SFG','2016-09-16 6:15:00',224444)
Insert into #SampleData values('GOL','2016-09-16 6:15:02',5457309)
Insert into #SampleData values('SIMCO','2016-09-16 6:15:04',79988393)
Insert into #SampleData values('UCL','2016-09-16 6:15:06',1649692)
Insert into #SampleData values('Mul','2016-09-16 6:15:08',992246)
Insert into #SampleData values('ABC','2016-09-16 6:15:10',421)
Insert into #SampleData values('FUL','2016-09-16 6:15:12',144)
Insert into #SampleData values('SILVER','2016-09-16 6:15:14',2242)
Insert into #SampleData values('ONC','2016-09-16 6:15:18',1420229)
Insert into #SampleData values('FUL','2016-09-16 6:15:20',79992246)
Insert into #SampleData values('IIF','2016-09-16 6:15:22',1873182)
Insert into #SampleData values('LOC','2016-09-16 6:15:22',79986728)
Insert into #SampleData values('UCT','2016-09-16 6:15:24',0)
Insert into #SampleData values('MOC','2016-09-16 6:15:26',252)
Insert into #SampleData values('INC','2016-09-16 6:15:31',1)
Try below query and see if it serves your purpose. Also attaching the output of the query for your review. The output is based on the insert script you have shared in your last reply.
-- *** cte_data section is not needed in the CTE if your table has the Identity Column.
-- *** Remove this section and replace RowID with your identity column name
; WITH cte_data
AS
(
SELECT *
, ROW_NUMBER() OVER(ORDER BY timestamp ASC) AS RowID
FROM #SampleData
)
, cte_to_be_matched
AS
(
SELECT *
, From_RowID = RowID
, To_RowID = ISNULL((LEAD(RowID) OVER(ORDER BY timestamp ASC) - 1), 999999999999999999)
FROM cte_data
WHERE name IN ('ABC', 'SILVER') -- *** Supply all your values to be matched here. You can also modify the query to read the XML parameter or comma seperated parameter or may be from some table
)
SELECT A.Name
, A.Timestamp
, A.Result
, B.Result AS ExpectedResult
FROM cte_data A
LEFT JOIN cte_to_be_matched B
ON A.RowID BETWEEN B.From_RowID AND B.To_RowID
ORDER BY A.timestamp ASC
October 31, 2019 at 2:11 pm
This is close, I think:
DROP TABLE IF EXISTS #SampleData;
CREATE TABLE #SampleData
(
Name VARCHAR(500)
,Timestamp DATETIME
,Result INT
);
INSERT #SampleData
(
Name
,Timestamp
,Result
)
VALUES
('BTC', '2016-10-15 08:47:29', 230)
,('ABC', '2016-09-16 6:14:54', 988777)
,('CARCO', '2016-09-16 6:14:56', 0)
,('CITI', '2016-09-16 6:14:56', 124)
,('CF', '2016-09-16 6:14:58', 2)
,('SFG', '2016-09-16 6:15:00', 224444)
,('GOL', '2016-09-16 6:15:02', 5457309)
,('SIMCO', '2016-09-16 6:15:04', 79988393)
,('UCL', '2016-09-16 6:15:06', 1649692)
,('Mul', '2016-09-16 6:15:08', 992246)
,('ABC', '2016-09-16 6:15:10', 421)
,('FUL', '2016-09-16 6:15:12', 144)
,('SILVER', '2016-09-16 6:15:14', 2242)
,('ONC', '2016-09-16 6:15:18', 1420229)
,('FUL', '2016-09-16 6:15:20', 79992246)
,('IIF', '2016-09-16 6:15:22', 1873182)
,('LOC', '2016-09-16 6:15:22', 79986728)
,('UCT', '2016-09-16 6:15:24', 0)
,('MOC', '2016-09-16 6:15:26', 252)
,('INC', '2016-09-16 6:15:31', 1);
WITH changes
AS (SELECT sd.Name
,sd.Timestamp
,sd.Result
,ChangeInd = IIF(sd.Name IN ('ABC', 'SILVER'), 1, 0)
FROM #SampleData sd)
,grps
AS (SELECT changes.Name
,changes.Timestamp
,changes.Result
,GroupNo = SUM(changes.ChangeInd) OVER (ORDER BY changes.Timestamp)
FROM changes)
SELECT grps.Name
,grps.Timestamp
,grps.Result
,ExpectedValue = FIRST_VALUE(grps.Result) OVER (PARTITION BY grps.GroupNo ORDER BY grps.Timestamp)
FROM grps
ORDER BY grps.Timestamp;
The absence of evidence is not evidence of absence
- Martin Rees
The absence of consumable DDL, sample data and desired results is, however, evidence of the absence of my response
- Phil Parkin
October 31, 2019 at 3:02 pm
This is a public forum, not private messages. You don't need to respond to every single person who responded with the exact same information.
Also, my name is Drew, not Dew or Allen.
This give the same results as Brahmanand's, but it only requires one table scan whereas his requires two.
WITH SampleOrdered AS
(
SELECT *, SUM(CASE WHEN sd.[Name] IN ('ABC', 'SILVER') THEN 1 ELSE 0 END) OVER(ORDER BY sd.Timestamp, sd.Name ROWS UNBOUNDED PRECEDING) AS grp
FROM #SampleData AS sd
)
SELECT *, FIRST_VALUE(s.Result) OVER(PARTITION BY s.grp ORDER BY s.Timestamp, s.Name)
FROM SampleOrdered s
Drew
J. Drew Allen
Business Intelligence Analyst
Philadelphia, PA
November 1, 2019 at 1:52 am
Thank you dear for your support.
I will validate and update the my comments.
Thanks & Regards,
Kanagarajan S.
November 1, 2019 at 2:01 am
Thank you Drew for your support.
I understand you message. Going forward I should avoid to place multiple times the same post for different users.
Also, Really sorry to mentioned your name wrongly.
Thank you so much for you & Phil Parkin for given scripts. I will validate and update my comments.
Thanks
Kanagarajan S.
Viewing 12 posts - 1 through 11 (of 11 total)
You must be logged in to reply to this topic. Login to reply