【问题标题】:How to select only the second max date from a table如何从表中仅选择第二个最大日期
【发布时间】:2017-03-05 18:46:30
【问题描述】:

我有一个存储交货日期和订单号的表格。

在这里,我能够获得具有最长交货日期的订单。

SELECT DISTINCT D.ORDER_NO
FROM DELIVERY D
WHERE D.CUSTOMER_NO =112 AND D.DELIVERY_DATE = (SELECT  MAX(D1.DELIVERY_DATE) FROM DELIVERY D1
WHERE D1.CUSTOMER_NO = 112 );

这里一个客户可能有多个订单。

现在我想要的是只获得第二个最大日期。

通过使用上述查询,我​​可以通过将= 更改为< 并在子查询中添加ORDER BY 来获取最大交货日期以外的数据列表。

但它是一个完整的列表,但我只想要第二个最大日期。

请告诉我如何才能获得第二个最大日期。

注意:我尝试过使用ROWNUM<=1,但我的日期有误

【问题讨论】:

  • 您使用的是 Oracle 还是 SQL Server?
  • 删除 SQL Server 标记,因为 ROWNUM 是 Oracle 功能
  • @TimBiegeleisen 我正在使用 Oracle

标签: sql oracle date greatest-n-per-group


【解决方案1】:

从表格中选择第二个最大日期

 SELECT MAX(date) FROM tbl_date WHERE date NOT IN (SELECT MAX(date) FROM tbl_date )
        OR
        SELECT DISTINCT date FROM tbl_date  ORDER BY date DESC LIMIT 1,1;
        OR
        SELECT MAX(date) FROM ( SELECT date FROM tbl_date  MINUS SELECT MAX(date) FROM tbl_date)

【讨论】:

    【解决方案2】:
    SELECT D.ORDER_NO
    FROM
    (
    SELECT DISTINCT D.ORDER_NO,D.DELIVERY_DATE,ROW_NUMBER()OVER(order by D.DELIVERY_DATE desc) RowNo
    FROM DELIVERY D
    WHERE D.CUSTOMER_NO =1128158 
    ORDER BY D.DELIVERY_DATE DESC)
    t WHERE t.RowNo = 2;
    

    【讨论】:

      【解决方案3】:

      你可以试试这个查询:

      SELECT DISTINCT ORDER_NO FROM DELIVERY WHERE CUSTOMER_NO=112 AND DELIVERY_DATE =
      (SELECT MAX(DELIVERY_DATE) FROM DELIVERY WHERE CUSTOMER_NO=112 AND 
      DELIVERY_DATE<(SELECT MAX(DELIVERY_DATE) FROM DELIVERY AND CUSTOMER_NO=112));
      

      子查询将返回第二个最大交货日期,这将给出第二个最大日期的 order_no。

      【讨论】:

        【解决方案4】:

        假设您使用的是 Oracle:

        SELECT *
        FROM
        (
            SELECT t.*, rownum rnum
            FROM
            (
                SELECT DISTINCT D.ORDER_NO
                FROM DELIVERY D
                WHERE D.CUSTOMER_NO = 112
                ORDER BY D.DELIVERY_DATE DESC
            ) t
            WHERE rownum <= 2
        )
        WHERE rnum >= 2
        

        【讨论】:

        • 当我单独运行子查询时,我得到 4 行,但是当我运行整个查询时,我得到 0 结果。而如果我更改 ROWNUM=1 我会得到 1 行。
        • 嗨,这很好用,但我刚刚使用@Munna Extreme 的答案中的ROW_NUMBER() 函数修改了您的查询,它也可以正常工作
        【解决方案5】:
          SELECT TOP 1 D.ORDER_NO
        FROM DELIVERY D WHERE D.CUSTOMER_NO =112 
         AND D.DELIVERY_DATE = (SELECT  MAX(D1.DELIVERY_DATE) FROM DELIVERY D1 WHERE D1.CUSTOMER_NO = 112 );
         ORDER BY  DELIVERY_DATE  DESC
        

        【讨论】:

          【解决方案6】:
          SELECT * FROM(
          SELECT DISTINCT D.ORDER_NO, ROW_NUMBER()OVER(order by D.DELIVERY_DATE desc) RowNo
          FROM DELIVERY D
          WHERE D.CUSTOMER_NO =112
          ) t where t.RowNo = 2
          

          【讨论】:

            【解决方案7】:

            更改D.DELIVERY_DATE =

            D.DELIVERY_DATE &lt;

            SELECT DISTINCT D.ORDER_NO
                FROM DELIVERY D
                WHERE D.CUSTOMER_NO =112 AND D.DELIVERY_DATE = (SELECT  MAX(D1.DELIVERY_DATE) FROM DELIVERY D1
                WHERE D1.CUSTOMER_NO = 112 );
            

            或类似下面的东西

            SELECT MAX(DELIVERY_DATE)
              FROM TABLE
             WHERE DELIVERY_DATE< ( SELECT MAX(DELIVERY_DATE)
                             FROM TABLE)
            

            【讨论】:

            • 请看我的问题,你说的已经完成了。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-25
            • 2018-07-16
            • 2013-03-05
            • 1970-01-01
            相关资源
            最近更新 更多