获取每个 ID 的最高值和第二高值 (SQL)

Get HIGHEST and SECOND HIGHEST value for each ID (SQL)

SQL 的新手。在 Access 2016 中。在 table 不同设备(EQUIP1、EQUIP2、EQUIP3)中,我想查询上次和倒数第二个维护日期。

我搜索的许多修复程序都没有考虑按 ID 分组(在我的例子中是 EQUIP#)

我有:

TABLE Maintenance
equipment      Date 
    1        1/1/2019
    1        1/2/2019
    1        1/3/2019
    2        2/1/2019
    2        2/2/2019
    2        2/3/2019

我需要的:

      QUERY LATESTDATES
 equipment     NewDate      PreviousDate 
    1         1/3/2019       1/2/2019  
    2         2/3/2019       2/2/2019    

编辑:谢谢!对语法有点了解,但这是我的最终解决方案:

SELECT [a1].equipment, NewDate, Max([b].Date) as PreviousDate

FROM
(SELECT equipment,Max(Date) as NewDate
FROM Maintenance AS [A]
GROUP BY equipment) AS [a1]

INNER JOIN Maintenance AS [b]
ON [b].equipment= [a1].equipment AND [b].Date <> [a1].NewDate
GROUP BY [a1].equipment, [a1].NewDate

Desired Result

这是我的解决方案,它可能不是最干净的,但它应该适用于任何 SQL。

select a1.equipment, highest_date, max(b.date) as second_highest_date
from
(
select equipment, max(date) as highest_date
from YOUR_TABLE as a
group by equipment
) a1
join YOUR_TABLE as b
on b.equipment = a1.equipment and b.date != a1.highest_date
group by a1.equipment, a1.highest_date

你可以试试这个:

WITH T1
AS ( SELECT   EQP, MAX(Date) COL2
     FROM     dbo.T_TEST
     GROUP BY EQP )
SELECT   B.EQP, B.Date, MAX(A.Date)
FROM     dbo.T_TEST A
         JOIN T1 B ON B.EQP = A.EQP
WHERE    A.Date < B.Date
GROUP BY B.EQP, B.Date;

或者如果 Access 不支持 CTE

SELECT   B.EQP, B.Date, MAX(A.Date)
FROM     dbo.T_TEST A
         JOIN ( SELECT   EQP, MAX(Date) COL2
                FROM     dbo.T_TEST
                GROUP BY EQP ) B ON B.EQP = A.EQP
WHERE    A.Date < B.Date
GROUP BY B.EQP, B.Date;

对于访问 - 试试这个

Select x.EQP, Max(x.Date) as NewDate , Max(y.Date) as PreviousDate from Maintenance as x 
INNER JOIN Maintenance as y ON x.EQP = y.EQP where x.Date > y.Date
group by x.EQP

如何用window函数更好地解决上面的问题? 我的代码不够优雅

select * from
(
select programno  , programdate, a.drk_date--, case when drk_date =1 then programDate 
from
(
select  programNo , programdate, DENSE_RANK() over (partition by programNo order by programdate desc) drk_date 
from program
)a
where a.drk_date <=2
)b
inner join
(
select programno  , programdate, drk_date--, case when drk_date =1 then programDate 
from
(
select  programNo , programdate, DENSE_RANK() over (partition by programNo order by programdate desc) drk_date 
from program
)c
where c.drk_date <=2
)d 
on b.programNo = d.programNo and b.drk_date < d.drk_date