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 top
或 limit
函数一起使用。我也试过 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 by
和 top 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
我在 Excel.
中使用以下代码查询来自 sql 服务器(用于 ERP 系统)的 return 数据我正在尝试 select 根据 desc
的排序,仅 Job.Job
(工作 table)中的前 1 条记录。但是,我无法让它与 select top
或 limit
函数一起使用。我也试过 where
中的 case when else
功能,但无法绕过。
如果您能阐明如何修改以下代码来做到这一点,我将非常高兴。
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 by
和 top 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