Получить HIGHEST и SECOND HIGHEST значение для каждого идентификатора (SQL) - PullRequest
0 голосов
/ 07 февраля 2019

плохо знаком с SQL.В Access 2016. В таблице различного оборудования (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

Желаемый результат

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Вы можете попробовать это:

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;
0 голосов
/ 07 февраля 2019

для доступа - попробуйте это

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
0 голосов
/ 07 февраля 2019

Это мое решение, оно может быть не самым чистым, но оно должно работать на любом 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
...