【问题标题】:Get HIGHEST and SECOND HIGHEST value for each ID (SQL)获取每个 ID 的最高和第二高值 (SQL)
【发布时间】:2019-07-01 00:24:35
【问题描述】:

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

Desired Result

【问题讨论】:

  • 你知道你用的是什么版本的mysql吗?
  • 我在Access 2016,我相信微软版本叫T-SQL?
  • 糟糕的是,我正在查看假定为 mysql 的标签

标签: sql ms-access highest


【解决方案1】:

如何使用窗口函数更好地解决上述问题? 我的代码不优雅

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 

【讨论】:

  • 这看起来像是一个问题,请在新帖子中提出问题,而不是将其作为答案发布
【解决方案2】:

访问权限 - 试试这个

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

【讨论】:

    【解决方案3】:

    你可以试试这个:

    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;
    

    【讨论】:

      【解决方案4】:

      这是我的解决方案,它可能不是最干净的,但它应该适用于任何 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
      

      【讨论】:

      • 谢谢!使用上面的变体来解决问题。
      • 如果你觉得我的回答令人满意,请不要忘记接受它作为这个问题的答案:)
      猜你喜欢
      • 2020-12-31
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 2018-06-20
      • 2021-11-01
      • 1970-01-01
      相关资源
      最近更新 更多