2016-11-04 4 views
0

Это мои исходные данные (анонимной):Найти наиболее последние записи по дате

id usage verified date 
1 4000 Y   2015-03-20 
2 5000 N   2015-06-20 
3 6000 N   2015-07-20 
4 7000 Y   2016-09-20 

Исходный запрос:

SELECT 
    me.usage, 
    mes.verified, 
    mes.date 
FROM 
    Table1 me, 
    Table2 mes, 
    Table3 m, 
    Table4 mp 
WHERE 
    me.theFk=mes.id 
    AND mes.theFk=m.id 
    AND m.theFk=mp.id 

Как бы я идти о выборе самой последней проверена и не проверяется?

Так что я бы оставил с:

id usage verified date 
1 6000 N   2015-07-20 
2 7000 Y   2016-09-20 

Я использую Microsoft SQL Server 2012.

+0

Тэг СУБД пожалуйста – JohnHC

ответ

1

Во-первых, не использовать неявное соединения. Это было прекращено более 10 лет назад.

Во-вторых, принять власть КТР, то в пункте и row_number:

with CTE as 
(
select 
    me.usage, 
    mes.verified, 
    mes.date, 
    row_number() over (partition by Verified order by Date desc) as CTEOrd 
from Table1 me 
inner join Table2 mes 
    on me.theFK = mes.id 
where mes.theFK in 
    (
    select m.id 
    from Table3 m 
    inner join Table4 mp 
    on mp.id = m.theFK 
) 
) 
select CTE.* 
from CTE 
where CTEOrd = 1 
0

Вы можете выбрать TOP 1 упорядоченный по дате для проверенного = N, union'd с ТОП 1 упорядоченный по дате для проверки = Y.

Или в псевдо SQL:

SELECT TOP 1 ...fields ... 
    FROM ...tables/joins... 
    WHERE Verified = 'N' 
    ORDER BY Date DESC 

UNION 

SELECT TOP 1 ...fields ... 
    FROM ...tables/joins... 
    WHERE Verified = 'Y' 
    ORDER BY Date DESC 
0
drop table #stack2 

CREATE TABLE #stack2 
    ([id] int, [usage] int, [verified] varchar(1), [date] datetime) 
; 

INSERT INTO #stack2 
    ([id], [usage], [verified], [date]) 
VALUES 
    (1, 4000, 'Y', '2015-03-20 00:00:00'), 
    (2, 5000, 'N', '2015-06-20 00:00:00'), 
    (3, 6000, 'N', '2015-07-20 00:00:00'), 
    (4, 7000, 'Y', '2016-09-20 00:00:00') 
; 


;with cte as (select verified,max(date) d from #stack2 group by verified) 
select row_number() over(order by s2.[verified]),s2.[usage], s2.[verified], s2.[date] from #stack2 s2 join cte c on c.verified=s2.verified and c.d=s2.date 

В соответствии с данными, показанными я написал запрос.

для сценария это будет использовать полный

WITH cte1 
    AS (SELECT me.usage, 
       mes.verified, 
       mes.date 
     FROM Table1 me, 
       Table2 mes, 
       Table3 m, 
       Table4 mp 
     WHERE me.theFk = mes.id 
       AND mes.theFk = m.id 
       AND m.theFk = mp.id), 
    cte 
    AS (SELECT verified, 
       Max(date) d 
     FROM cte1 
     GROUP BY verified) 
SELECT Row_number() 
     OVER(
      ORDER BY s2.[verified]), 
     s2.[usage], 
     s2.[verified], 
     s2.[date] 
FROM cte1 s2 
     JOIN cte c 
     ON c.verified = s2.verified 
      AND c.d = s2.date 
0

Вы можете как ниже Without join.

-- Mock data 
DECLARE @Tbl TABLE (id INT, usage INT, verified CHAR(1), date DATETIME) 
INSERT INTO @Tbl 
VALUES 
(1, 4000 ,'Y',   '2015-03-20'), 
(2, 5000 ,'N',   '2015-06-20'), 
(3, 6000 ,'N',   '2015-07-20'), 
(4, 7000 ,'Y',   '2016-09-20') 


SELECT 
    A.id , 
    A.usage , 
    A.verified , 
    A.MaxDate 
FROM 
(
    SELECT 
     id , 
     usage , 
     verified , 
     date, 
     MAX(date) OVER (PARTITION BY verified) MaxDate  
    FROM 
     @Tbl 
) A 
WHERE 
    A.date = A.MaxDate 

Результат:

id   usage  verified MaxDate 
----------- ----------- -------- ---------- 
3   6000  N  2015-07-20 
4   7000  Y  2016-09-20 
0
CREATE TABLE #Table (ID INT ,usage INT, verified VARCHAR(10), _date DATE) 

INSERT INTO #Table (ID , usage , verified , _date) 
SELECT 1,4000 , 'Y','2015-03-20' UNION ALL 
SELECT 2, 5000 , 'N' ,'2015-06-20' UNION ALL 
SELECT 3, 6000 , 'N' ,'2015-07-20' UNION ALL 
SELECT 4, 7000 , 'Y' ,'2016-09-20' 


SELECT ROW_NUMBER() OVER(ORDER BY usage) ID,usage , A.verified , A._date 
FROM #Table 
JOIN 
(
    SELECT verified , MAX(_date) _date 
    FROM #Table 
    GROUP BY verified 
) A ON #Table._date = A._date 
Смежные вопросы