ASU Interview Question
Country: United States
create table #TempTab (Name varchar(100), Decision bit, PollDate Date)
insert into #TempTab VALUES('John', 1, '1 Jan 2016')
insert into #TempTab VALUES('John', 0, '2 Jan 2016')
insert into #TempTab VALUES('Linda', 1, '1 Jan 2016')
insert into #TempTab VALUES('Mark', 1, '5 Jan 2016')
insert into #TempTab VALUES('Rob', 0, '5 Jan 2016')
;WITH T AS
(select *
, ROW_NUMBER() OVER(PARTITION BY Name ORDER BY PollDate desc) r
from #TempTab)
SELECT Name
FROM T
WHERE r = 1
and Decision = 1
CREATE table RSVP (Name Varchar(5), Decision Varchar(1), d Date);
insert into RSVP values
('Jon', 'Y', '2016-1-1'),
('Jon', 'N', '2016-1-2'),
('Linda', 'Y', '2016-1-1'),
('Mark', 'Y', '2016-1-5'),
('Rob', 'N', '2016-1-5')
SELECT count(*) FROM (SELECT * FROM RSVP r1 WHERE d>=(SELECT Max(d) FROM RSVP r2 WHERE r1.Name=r2.Name)) t WHERE t.Decision='Y'
CREATE table RSVP (Name Varchar(5), Decision Varchar(1), d Date);
insert into RSVP values
('Jon', 'Y', '2016-1-1'),
('Jon', 'N', '2016-1-2'),
('Linda', 'Y', '2016-1-1'),
('Mark', 'Y', '2016-1-5'),
('Rob', 'N', '2016-1-5')
SELECT count(*) FROM (SELECT * FROM RSVP r1 WHERE d>=(SELECT Max(d) FROM RSVP r2 WHERE r1.Name=r2.Name)) t WHERE t.Decision='Y'
--First Approach
;WITH CTE AS (
SELECT Name, MAX(DDate ) DDate
FROM RSVP
GROUP BY Name)
SELECT COUNT(*)
FROM RSVP Inner Join CTE ON RSVP.DDate = CTE.DDate
AND RSVP.Name = CTE.Name
WHERE RSVP.Decision = 'Y'
--Second Approach
;With CTE1 AS (
SELECT Name,
ROW_NUMBER() OVER (Partition by Name Order by DDate DESC) AS ROWE
,Decision,DDate
FROM RSVP)
SELECT *
FROM CTE1
WHERE Rowe = 1
AND Decision = 'Y'
--Simple answer
create table #tblParty (name varchar(100),decision char(1), Actiondate date)
insert into #tblParty values('Jon','Y','1 jan 2016')
insert into #tblParty values('Jon','N','2 jan 2016')
insert into #tblParty values('Linda','Y','1 jan 2016')
insert into #tblParty values('Mark','Y','1 jan 2016')
insert into #tblParty values('Rob','N','1 jan 2016')
SELECT * FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY ACTIONDATE DESC) AS ROW_NUM,NAME,DECISION,ACTIONDATE FROM #tblparty
)T WHERE ROW_NUM=1 AND T.DECISION='Y'
There are 2 ways to solve the query:
--Using join on table with latest_response
WITH
latest_response AS
(
SELECT
name,
MAX(response_date) final_response_date
FROM
rsvp
GROUP BY
name
)
SELECT
COUNT(a.name)
FROM
rsvp a,
latest_response b
WHERE
a.response_date=b.final_response_date
AND a.name=b.name
AND decision='Y';
--Without join using row_number to get latest_response
WITH ordered_response AS
(select *
, ROW_NUMBER() OVER(PARTITION BY Name ORDER BY response_date desc) r
from rsvp)
SELECT count(Name)
FROM ordered_response
WHERE r = 1
and Decision = 'Y';
This is the perfect answer
select name, start_dt as start_dt, decision from (
select name, start_dt, decision, rank() over (partition by name order by start_dt desc) from rsvp order by name,rank
) as a where rank=1 and decision='Y';
Table Details:
create table rsvp (
name varchar(30),
decision char(1),
start_dt date);
insert into rsvp values ('Jon','Y', '2016-01-01');
insert into rsvp values ('Jon', 'N', '2016-01-02');
insert into rsvp values ('Linda', 'Y', '2016-01-01');
insert into rsvp values ('Mark', 'Y', '2016-05-01');
insert into rsvp values ('Rob', 'N', '2016-01-05');
insert into rsvp values ('jack', 'N', '2016-01-06');
insert into rsvp values ('Jon','Y','2016-01-03');
insert into rsvp values ('Keith','Y','2016-01-01');
insert into rsvp values ('Keith','N','2016-01-02');
insert into rsvp values ('Rob', 'N', '2016-01-06');
;WITH CTE_BaseT
AS
(
SELECT 'Jon' AS CName, 'Y' as Decision, CAST('2016-01-01' AS Date) AS [D_Date]
UNION ALL
SELECT 'Jon' AS CName, 'N' as Decision, CAST('2016-01-02' AS Date) AS [D_Date]
UNION ALL
SELECT 'Linda' AS CName, 'Y' as Decision, CAST('2016-01-01' AS Date) AS [D_Date]
UNION ALL
SELECT 'Mark' AS CName, 'Y'as Decision, CAST('2016-01-05' AS Date) AS [D_Date]
UNION ALL
SELECT 'Rob' AS CName, 'Y' as Decision, CAST('2016-01-05' AS Date) AS [D_Date]
UNION ALL
SELECT 'Rob' AS CName, 'N' as Decision, CAST('2016-01-07' AS Date) AS [D_Date]
UNION ALL
SELECT 'Rob' AS CName, 'Y' as Decision, CAST('2016-01-08' AS Date) AS [D_Date]
)
SELECT CName,Decision
FROM CTE_BaseT C1
WHERE C1.D_Date = (SELECT MAX(C2.D_Date) FROM CTE_BaseT C2 WHERE C2.CName = C1.CName)
IF OBJECT_ID('tempdb..#RSVP', 'U') IS NOT NULL
DROP TABLE #RSVP;
CREATE TABLE #RSVP
(
Name VARCHAR(25) ,
Decision CHAR(1) ,
Dates DATE
);
INSERT INTO #RSVP
( Name, Decision, Dates )
VALUES ( 'John', 'Y', '2016-01-01'),
( 'John', 'N', '2016-01-02'),
( 'Linda', 'Y', '2016-01-01'),
( 'Mark', 'Y', '2016-01-05'),
( 'Rob', 'N', '2016-01-05');
WITH CTE AS
(SELECT Name,
Decision,
Dates,
ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Dates DESC) AS RowN
FROM #RSVP
)
SELECT COUNT(*)
FROM CTE WHERE CTE.RowN = 1 AND CTE.Decision = 'Y';
function closest(arr, n){
if(arr.length === 1) return arr[0];
var left = arr.slice(0, Math.floor(arr.length/2));
var right = arr.slice(Math.floor(arr.length/2), arr.length);
if( Math.abs((n - left[left.length-1])) < Math.abs((n -right[0])) ){
return closest(left, n);
} else {
return closest(right, n);
}
}
- jatin vadodariya October 13, 2016