2015-06-11 32 views
1

大型数据库和一个字段应该是一个递增的数字,但有时重置,我必须检测到它们(粗体行)PostgreSQL的:检查的最后一个数字是最高的

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的数字。你知道另一种更简单的方法吗?

我担心的是,由于我有一个大型数据库,因此可能会出现问题。

你知道我该怎么做我正在考虑的查询还是你有其他想法?

+0

那么预期的结果是什么? – jarlh

+1

你没有定义你想要*完全*。我还怀疑你正在并行运行两个RDBMS,并且有未知的版本号和表定义(具有确切的数据类型和约束)。而且我们通常喜欢看你尝试过的东西,即使它不起作用。 –

+0

我想检测那些商店(商店的ID是足够的)。我想要下面的一些功能,但是我不能使用它们,因为我目前使用的服务器不支持它。我必须使用MAX或MIN等基本函数,我想我必须做一些子查询。 –

回答

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; 
+0

非常感谢您的answear我非常肯定我可以得到我想要的与您查询,但是如上所述,服务器不支持这些功能。我必须使用基本功能来获得我想要的。 –

+0

这是不允许的。即使你把'first_value(..)放在(..)上..)''在'having'子句中,而不是'lastsell',你会得到一个错误:'错误:窗口函数不允许在HAVING' –

1

你心目中的查询会给你具有Sell号不连续的所有Shop值。

如果你想获得违规记录,你可以使用下面的查询:

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 

Demo here

编辑:

如果你不能使用窗口功能,您只需要具有连续性的店铺ID,那么你可以使用以下查询:

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 

如果您有每Shop的唯一DATE值,则上述方法可行。

+0

非常感谢你的answear我很确定我可以得到我想要的与你查询但是,如上所述,服务器不支持这些功能。我必须使用基本功能来获得我想要的。 –

+0

@PedroPereira请检查我所做的修改。 –

相关问题