繁体   English   中英

火鸟SQL从最大值获取相应的字段

[英]firebird sql get corresponding field from max value

我正在处理此报告,该报告用于返回项目列表的最后购买日期和最后购买数量。

我的基本sql如下:

select im.ItemName, max(prh.Receiptdate), prl.ReceiptQuantity/*which corresponds with max ReceiptDate*/
from ItemMaster im
left join PurchaseReceiptLines prl on prl.ItemName = im.ItemName
left join PurchaseReceiptHeader prh on prh.ReceiptNum = prl.ReceiptNum
group by im.ItemName

有人有指针吗?

任何帮助都是极好的

Firebird 3.0支持窗口功能。 在这种情况下, row_number()是正确的方法。 在旧版本中:

with i as (
      select im.ItemName, prh.Receiptdate, prl.ReceiptQuantity
      from ItemMaster im left join
           PurchaseReceiptLines prl
           on prl.ItemName = im.ItemName left join
           PurchaseReceiptHeader prh
           on prh.ReceiptNum = prl.ReceiptNum
     )
select i.*
from i
where i.Receiptdate = (select i2.Receiptdate from i i2 where i2.ItemName = i.ItemName);
select im.itemname, max(prh.receiptdate), 
(select prl.receiptquantity from purchasereceiptlines prl
   join purchasereceiptheader prh on prh.receiptnum = prl.receiptnum
  where prl.itemname = im.itemname)
from itemmaster im
left join purchasereceiptlines prl on prl.itemname = im.itemname
left join purchasereceiptheader prh on prh.receiptnum = prl.receiptnum
group by im.itemname

您的表是否具有唯一的综合ID-主键在插入新行时总是增加? 通常只有一个。 然后,最大的ID通常对应于最新购买的商品(除非事实发生后很长一段时间才将离线购买商品插入数据库)。因此,通常(并非总是)您可以改为按商品而非最大商品查找max(ID) (日期)。 这样做的好处是,您将不会有两个具有相同ID的行,而必须具有相同日期的行。...在后一种情况下,您意外地会为每种商品获得几行,并且程序会呕吐

因此,从这一点开始,我将假设它们是正确的:1)在您的表中,您具有典型的整数PRIMARY-KEY列ID,并用generator(aka sequence)填充,以便以后插入的行将始终具有更大的ID。 。 2)您在购买完成后立即插入购买记录。 离线时不会出售产品,以后也不会批量插入已经存在数小时/天的累积数据。

实际上,如果您没有每年或每月将其重置为1,则您的ReceiptNum可能类似于该ID。 但是通常情况下,现实世界中的文档编号会及时重置,因此首选使用合成ID将表链接在一起

在这种情况下,获得每个商品的最后记录相当简单:

SELECT MAX(ID), ItemName from PurchaseReceiptLines group by ItemName

当然,这不会给您日期和数量,因为这是一个“总计”请求。

SELECT PRL_Data.ID, PRL_Data.ItemName, prh.Receiptdate, PRL_Data.ReceiptQuantity 
FROM PurchaseReceiptLines PRL_Data 
JOIN (SELECT MAX(ID) as ID, ItemName from PurchaseReceiptLines group by ItemName) PRL_Max
  ON PRL_Max.ID = PRL_Data.ID
JOIN PurchaseReceiptHeader prh
  ON prh.ID = PRL_Data.Header_ID  /* like prh.ReceiptNum = prl.ReceiptNum but with never resetting */

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM