获取每个 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
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