firebird sql从最大值获取相应的字段

时间:2017-03-27 00:18:03

标签: sql firebird greatest-n-per-group

我正在处理此报告,该报告旨在返回项目列表的上次购买日期和上次购买数量。

我的基本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

有没有人有任何指示?

任何帮助都很棒

3 个答案:

答案 0 :(得分:1)

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);

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您的表是否具有唯一的合成ID - 插入新行时始终会增加主键?通常有一个。然后,最大的ID通常会对应于最新的购买(除非您在事后很久就插入数据库中进行了离线购买)。因此,通常(并非总是)您可以寻找每个商品的最大(ID),而不是最大(日期)。这有一个奖励,你可能不会有两个具有相同ID的行,而你可以拥有相同日期的行....在后一种情况下,你会意外地获得每行好几行,你的程序会呕吐

所以,从这一点开始我会认为那些是真的: 1)在你的表中你有一个典型的整数PRIMARY-KEY列ID,用生成器(也就是序列)填充,这样以后插入的行总是会有更大的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 */