当前位置: 首页 > 面试题库 >

SQL难题,如何选择零件的最新日期,但每个零件仅1行(唯一)

吕征
2023-03-14
问题内容

今天早上我想把头缠起来。

我试图显示inventory零件状态(针对我们的产品),并且仅当我尝试退回所有零件时,此查询才会变得复杂。

让我来说明一下:

  • 单桌 inventoryReport
  • 我有一个要显示的X零件的不同列表,其结果必须是X#行(每个零件1行,显示最新的库存条目)。
  • 该表由库存变更的过时条目组成(因此我只需要LATEST每个零件的日期条目)。
  • 该表中包含所有数据,因此无需联接。

当前只有1个部分,这非常简单,我可以通过执行以下sql(给您一些想法)来完成此操作:

SELECT     TOP (1) ldDate, ptProdLine, inPart, inSite, inAbc, ptUm, inQtyOh + inQtyNonet AS in_qty_oh, inQtyAvail, inQtyNonet, ldCustConsignQty, inSuppConsignQty
FROM         inventoryReport
WHERE     (ldPart = 'ABC123')
ORDER BY ldDate DESC

这让我获得了我的TOP1行,每个部分非常简单,但是我需要显示所有X(说30个部分)。所以我需要30行,得到的结果。当然,简单的解决方案是在我的代码中循环执行X#的sql调用(但这会很昂贵),这样就足够了,但是为此,我想更进一步地使用此SQL,以减少x#的返回到数据库的调用。
(如果不需要的话)减少到只有1个查询。

从这里我可以看到,在寻找结果集时,我需要以某种方式跟踪每个项目的最新日期。

我最终会做一个

WHERE ldPart in ('ABC123', 'BFD21', 'AA123', etc)

限制我需要的零件。希望我已经清楚地阐明了我的问题。让我知道您是否有想法。我不能做,DISTINCT因为行不一样,日期必须是最新的,并且我最多需要X行。

有什么想法吗?我被困住了…


问题答案:

编辑
:请确保测试每个解决方案的性能。正如该问题所指出的那样,使用ROW_NUMBER的CTE方法的效果可能会更好。

;with cteMaxDate as (
    select ldPart, max(ldDate) as MaxDate
        from inventoryReport
        group by ldPart
)
SELECT md.MaxDate, ir.ptProdLine, ir.inPart, ir.inSite, ir.inAbc, ir.ptUm, ir.inQtyOh + ir.inQtyNonet AS in_qty_oh, ir.inQtyAvail, ir.inQtyNonet, ir.ldCustConsignQty, ir.inSuppConsignQty
    FROM cteMaxDate md
        INNER JOIN inventoryReport ir
            on md.ldPart = ir.ldPart
                and md.MaxDate = ir.ldDate


 类似资料:
  • 问题内容: 使用以下查询和结果,我正在寻找ChargeId和ChargeType唯一的最新条目。 期望的: 问题答案: 您可以使用GROUP BY按类型和ID对项目进行分组。然后,您可以使用MAX()聚合函数来获取最近的服务月份。以下返回带有ChargeId,ChargeType和MostRecentServiceMonth的结果集

  • 问题内容: 我有一个数据库,如下所示; 我想做的是产生一个结果,该结果具有该日期最早()的每个客户的KWH读数,该日期将由用户以Web形式选择。 结果将/应该类似于; 这里显示的行数超过了每天,并且有更多的客户,并且客户数量会定期更改。 我在SQL方面没有太多经验,我研究过子查询等,但是我没有内容来弄清楚如何按最早阅读每个客户的方式来安排它,然后仅输出该列。 它在Redhat / CentOS上的

  • 问题内容: 您好,我有一个带有列的表: *使用oracle 我想知道如何获取给定用户的最新添加的文档。 谢谢 问题答案:

  • 问题内容: 我有一张用户签入和签出时间的表(“ lms_attendance”),如下所示: 我正在尝试创建此表的视图,该表将仅输出每个用户ID的最新记录,同时给我“ in”或“ out”值,如下所示: 到目前为止,我已经很接近了,但是我意识到视图将不接受子查询,这使它变得更加困难。我得到的最接近的查询是: 但是我得到的是: 这很接近,但并不完美。我知道最后一个分组依据不应存在,但是如果没有它,它

  • 问题内容: 这是我的表结构- 我想清楚地选择所有的数据(以及日期)。由于日期在两个相同的条目之间会有所不同,因此我想选择日期最近的行。我希望得到这样的结果- 我不想要这个- 我正在使用此查询- 但是它只能挑一排。我该如何纠正? 问题答案: 试试这个查询 如果只想使用此查询: SQL字段 如果要查找所有用户的最新日期,请使用此查询 在此查询中,还将包含的数据

  • 问题内容: 我试图一次从一张桌子上得到2行。上周的最小日期时间(今天-7)和最晚的日期(今天)的一个。 我的桌子: 我可以通过以下方式选择上周的数据: 但我只想要第1行和第125行,因为这些是用于计算的行。所以我的问题是: 如何从上一个查询的结果中选择2行(带有MIN和MAX日期)? 问题答案: 您可以使用此: 编辑: 由于两台计算机完全有可能具有相同的值,因此应更新查询以在子句中也包含过滤器。我