【问题标题】:How to pull the whole row which has the latest date in SQL?如何在 SQL 中提取具有最新日期的整行?
【发布时间】:2014-10-22 20:46:44
【问题描述】:

我正在尝试选择与最近订单相关的一对产品 - 配送中心(基于订单日期)。对于一个订单,我可以有多个产品,但整个订单将从一个特定的配送中心发货。 如何选择最新订单附带的特定产品配送中心? 我的结构基本上是这样的:

data.orderdetail 表有ordernumorderdatedistributioncenter

我试着像这样拉,但它没有给我想要的结果。我使用的是 sql server 2008:

SELECT DISTINCT y.OrderNum, y.Product, y.DistributionCenter
              , CAST(y.OrderDate AS DATE) AS Orderdate
FROM         (SELECT   OrderNum, MAX(CAST(Orderdate AS date)) AS orderdate
                       FROM  data.OrderDetail
                       GROUP BY OrderNum) AS x 
INNER JOIN data.OrderDetail AS y 
ON y.OrderNum = x.OrderNum

【问题讨论】:

  • 您基本上必须按 orderdate 降序排列才能获得最新条目
  • ORDER BY orderdate LIMIT 1
  • 期望的结果是什么?正确的结果是什么?
  • 为什么要对无效 T-SQL 的评论投赞成票? LIMIT

标签: sql sql-server tsql


【解决方案1】:

看起来您的联接条件中还需要一个子句

你有

ON y.OrderNum = x.OrderNum

这将返回与子查询中订单号匹配的所有订单

但你需要

ON y.OrderNum = x.OrderNum
AND y.OrderDate = x.orderdate

这将返回与子查询中的订单号匹配的所有订单以及该订单号的最大日期

SELECT DISTINCT 
y.OrderNum, 
y.Product, 
y.DistributionCenter, 
CAST(y.OrderDate AS DATE) AS Orderdate 
FROM (
     SELECT 
     OrderNum, 
     MAX(CAST(Orderdate AS date)) AS orderdate 
     FROM data.OrderDetail 
     GROUP BY OrderNum
     ) AS x 
INNER JOIN 
data.OrderDetail AS y 
ON y.OrderNum = x.OrderNum
AND y.OrderDate = x.orderdate

【讨论】:

    【解决方案2】:

    我相信您正在寻找的是 row_number。这将按 OrderNum 对结果集进行分区,然后按 OrderDate 对结果集进行排名。然后,您可以在另一个 where 子句中过滤掉多余的行。

    select result.*,
        CAST(result.OrderDate as date) as Orderdate,
    from (
        select y.*,
            row_number() over (
                partition by y.OrderNum order by CAST(y.OrderDate as date) desc
                ) rank_
        from (
            select OrderNum,
                MAX(CAST(Orderdate as date)) as orderdate
            from data.OrderDetail
            group by OrderNum
            ) as x
        inner join data.OrderDetail as y on y.OrderNum = x.OrderNum
        ) result
    where result.rank_ = 1;
    

    【讨论】:

    • 谢谢伙计,但由于某种原因,它仍然会弹出一大堆与该产品分销中心相关的订单。我只想返回最新的订单号。
    • 那么您是否只想退回一份订单?
    • 你好,是的,只是最近订购的一对产品配送中心。谢谢
    【解决方案3】:
    select * from 
    (
      SELECT OrderNum, Product, DistributionCenter, OrderDate 
           , ROW_NUMBER() over (partition by OrderNum order by OrderDate  desc) as rownum
        FROM OrderDetail
    )  as xxx
    where xxx.rownum = 1
    

    ROW_NUMBER (Transact-SQL)

    【讨论】:

      【解决方案4】:

      试试这个。

      ; WITH CTE1
      AS (
          SELECT
              od.OrderNum
              , od.Product
              , od.DistributionCenter
              , CAST(od.OrderDate AS DATE) AS OrderDate
              , RowNumber = ROW_NUMBER() OVER (PARTITION BY od.Product, od.DistributionCenter ORDER BY CAST(od.OrderDate AS DATE) DESC)
          FROM data.OrderDetail od
      )
      SELECT
          OrderNum
          , Product
          , DistributionCenter
          , OrderDate
      FROM CTE1
      WHERE RowNumber = 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-25
        • 2015-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        相关资源
        最近更新 更多