SQL - 只显示来自一个 table 的最新记录(按 desc 排序)

SQL - only show latest record (order by desc) from one table

我在 Excel.

中使用以下代码查询来自 sql 服务器(用于 ERP 系统)的 return 数据

我正在尝试 select 根据 desc 的排序,仅 Job.Job(工作 table)中的前 1 条记录。但是,我无法让它与 select toplimit 函数一起使用。我也试过 where 中的 case when else 功能,但无法绕过。

如果您能阐明如何修改以下代码来做到这一点,我将非常高兴。

**** 仅 return 每个 Material 的第一行 ****

SELECT
  SO_Detail.Status,
  SO_Detail.Sales_Order,
  SO_Detail.SO_Line,
  SO_Detail.Material,
  SO_Detail.Rev,
  SO_Header.Customer_PO,
  SO_Detail.Order_Qty,
  Coalesce(Material_Location.On_Hand_Qty, 0),
  SO_Detail.Promised_Date,
  SO_Detail.Note_Text,
  Material.Description,
  Job.Status AS Status1,
  Job.Job 

FROM
  SO_Detail
  LEFT OUTER JOIN Material_Location ON SO_Detail.Material = Material_Location.Material
  LEFT OUTER JOIN SO_Header ON SO_Detail.Sales_Order = SO_Header.Sales_Order
  INNER JOIN Material ON Material.Material = SO_Detail.Material
  INNER JOIN Job ON SO_Detail.Material = Job.Part_Number

WHERE
  SO_Detail.Status = 'open'

ORDER BY
  SO_Detail.Sales_Order,
  SO_Detail.SO_Line,
  Job.Job desc

如果没有足够的信息,我会尝试在您的 order by:

中使用 row_number 函数或 case 语句

使用 row_number 函数和派生的 table:

select *
from
(SELECT
  SO_Detail.Status,
  SO_Detail.Sales_Order,
  SO_Detail.SO_Line,
  SO_Detail.Material,
  SO_Detail.Rev,
  SO_Header.Customer_PO,
  SO_Detail.Order_Qty,
  Coalesce(Material_Location.On_Hand_Qty, 0),
  SO_Detail.Promised_Date,
  SO_Detail.Note_Text,
  Material.Description,
  Job.Status AS Status1,
  Job.Job,
  row_number() over (partition by job.job order by job.job desc) rn

FROM
  SO_Detail
  LEFT OUTER JOIN Material_Location ON SO_Detail.Material = Material_Location.Material
  LEFT OUTER JOIN SO_Header ON SO_Detail.Sales_Order = SO_Header.Sales_Order
  INNER JOIN Material ON Material.Material = SO_Detail.Material
  INNER JOIN Job ON SO_Detail.Material = Job.Part_Number

WHERE
  SO_Detail.Status = 'open') t

where t.rn = 1

在您的 order bytop 1:

中使用 case 语句
SELECT TOP 1
  SO_Detail.Status,
  SO_Detail.Sales_Order,
  SO_Detail.SO_Line,
  SO_Detail.Material,
  SO_Detail.Rev,
  SO_Header.Customer_PO,
  SO_Detail.Order_Qty,
  Coalesce(Material_Location.On_Hand_Qty, 0),
  SO_Detail.Promised_Date,
  SO_Detail.Note_Text,
  Material.Description,
  Job.Status AS Status1,
  Job.Job 

FROM
  SO_Detail
  LEFT OUTER JOIN Material_Location ON SO_Detail.Material = Material_Location.Material
  LEFT OUTER JOIN SO_Header ON SO_Detail.Sales_Order = SO_Header.Sales_Order
  INNER JOIN Material ON Material.Material = SO_Detail.Material
  INNER JOIN Job ON SO_Detail.Material = Job.Part_Number

WHERE
  SO_Detail.Status = 'open'

ORDER BY
  SO_Detail.Sales_Order,
  SO_Detail.SO_Line,
  Job.Job desc,
  case when job.status = 'Complete' then 1 else 2 end

如果两者均无效,请提供更多详细信息,例如示例数据和 tables。请注意,您有一个 SQL-Server 标记,而 limit 是一个 MySQL 语法。

更新:

我回来看到你更新了你的问题。这将 return 每个 material:

的最新结果
select *
from
(SELECT
  SO_Detail.Status,
  SO_Detail.Sales_Order,
  SO_Detail.SO_Line,
  SO_Detail.Material,
  SO_Detail.Rev,
  SO_Header.Customer_PO,
  SO_Detail.Order_Qty,
  Coalesce(Material_Location.On_Hand_Qty, 0),
  SO_Detail.Promised_Date,
  SO_Detail.Note_Text,
  Material.Description,
  Job.Status AS Status1,
  Job.Job ,
  row_number() over(partition by Material.Description order by Job.Job desc) rn

FROM
  SO_Detail
  LEFT OUTER JOIN Material_Location ON SO_Detail.Material = Material_Location.Material
  LEFT OUTER JOIN SO_Header ON SO_Detail.Sales_Order = SO_Header.Sales_Order
  INNER JOIN Material ON Material.Material = SO_Detail.Material
  INNER JOIN Job ON SO_Detail.Material = Job.Part_Number

WHERE
  SO_Detail.Status = 'open') t --name of derived query

where t.rn = 1
-- you can then add an order statement if you need. Keep in note 
-- I named the derived query t. So if you need to order by it'll need to be t.column

将来,如果您发表评论并让回答者知道您已更新或哪些有效或无效,您的问题很可能会得到解答。否则它只会排在队列中并消失在互联网中 space。

对于select desc top 1 row in Job table,你可以写一个lil select sentence

SELECT 
SO_Detail.Status, 
SO_Detail.Sales_Order, 
SO_Detail.SO_Line,
SO_Detail.Material,
SO_Detail.Rev,
SO_Header.Customer_PO,
SO_Detail.Order_Qty,
Coalesce(Material_Location.On_Hand_Qty, 0),
SO_Detail.Promised_Date,
SO_Detail.Note_Text,
Material.Description,
Job.Status AS Status1,
Job.Job 
FROM
SO_Detail
LEFT OUTER JOIN Material_Location ON SO_Detail.Material = Material_Location.Material
LEFT OUTER JOIN SO_Header ON SO_Detail.Sales_Order = SO_Header.Sales_Order
INNER JOIN Material ON Material.Material = SO_Detail.Material
INNER JOIN (Select top 1 * from Job order by Job.Job desc) as TempJob ON     SO_Detail.Material = TempJob.Part_Number
WHERE
SO_Detail.Status = 'open'
ORDER BY
SO_Detail.Sales_Order,
SO_Detail.SO_Line,
JobTemp.Job desc

您可以使用此查询。

SELECT * FROM 
   ( SELECT
      SO_Detail.Status,
      SO_Detail.Sales_Order,
      SO_Detail.SO_Line,
      SO_Detail.Material,
      SO_Detail.Rev,
      SO_Header.Customer_PO,
      SO_Detail.Order_Qty,
      Coalesce(Material_Location.On_Hand_Qty, 0) Column1,
      SO_Detail.Promised_Date,
      SO_Detail.Note_Text,
      Material.Description,
      Job.Status AS Status1,
      Job.Job, 
      ROW_NUMBER() OVER(PARTITION BY SO_Detail.Material ORDER BY Job.Job desc) AS RN
    FROM
      SO_Detail
      LEFT OUTER JOIN Material_Location ON SO_Detail.Material = Material_Location.Material
      LEFT OUTER JOIN SO_Header ON SO_Detail.Sales_Order = SO_Header.Sales_Order
      INNER JOIN Material ON Material.Material = SO_Detail.Material
      INNER JOIN Job ON SO_Detail.Material = Job.Part_Number
    WHERE
      SO_Detail.Status = 'open'
) AS T
WHERE RN = 1
ORDER BY
  Sales_Order,
  SO_Line