Postgresql:检查最后一个数字是否最高

时间:2015-06-11 11:19:14

标签: sql postgresql subquery max

我有大型数据库,一个字段应该是增量编号,但有时会重置,我必须检测它们(粗体行)

Table 1:
Shop    #Sell       DATE
EC1         56          1/10/2015
EC1         57          2/10/2015
**EC1           11          3/10/2015
EC1         12          4/10/2015**
AS2         20          1/10/2015
AS2         21          2/10/2015
AS2         22          3/10/2015
AS2         23          4/10/2015

为了解决这个问题,我想找到每个SHOP的最大数量,并检查它是否是具有最高DATE的数字。你知道另一种更简单的方法吗?

我担心的是,由于我有一个大型数据库,所以按照我的方式行事可能会有问题。

您知道我如何处理我正在考虑的查询,或者您是否有其他想法?

2 个答案:

答案 0 :(得分:1)

您想到的查询会为您提供ShopSell不连续的SELECT Shop, Sell, DATE FROM ( SELECT Shop, Sell, DATE, LAG(Sell) OVER (PARTITION BY Shop ORDER BY DATE) AS prevSell FROM Shops ) t WHERE Sell < prevSell ORDER BY DATE LIMIT 1 个值。

如果您想获取违规记录,可以使用以下查询:

Shop

上述查询将返回在每个Shop Sell DATE --------------------- EC1 11 2015-03-10 分区中找到的第一个不连续性。

<强>输出:

SELECT s.Shop
FROM Shops AS s
INNER JOIN (
   SELECT Shop, MAX(Sell) AS Sell, MAX(DATE) AS DATE
   FROM Shops
   GROUP BY Shop ) t 
ON s.Shop = t.Shop AND s.DATE = t.DATE
WHERE t.Sell <> s.Sell

Demo here

修改

如果你不能使用窗口函数而你只想要商店的id具有不连续性,那么你可以使用以下查询:

DATE

如果每个Shop都有唯一的{{1}}值,则上述操作会有效。

答案 1 :(得分:0)

我认为以下是您想要的查询类型:

select s.*
from (select shop, max(sell) as maxsell, 
             first_value(sell) over (partition by shop order by date desc) as lastsell
      from shops s
      group by shop
     ) s
where maxsell <> lastsell;