试图理解糟糕的SQL查询

5

有人可以帮我理解这个查询到底是做什么的吗?

SELECT pp.Sedol
    ,MAX(MAX(Id)) OVER (
        PARTITION BY pp.Sedol
        ,MAX(pp.ValueDate)
        ) PriceId
FROM Prices pp
GROUP BY pp.Sedol

你不能在聚合函数内部进行聚合。这将会抛出语法错误。 - Jaaz Cole
很遗憾,它并没有。我没有写这个,我只是试图理解它应该做什么。 - František Škandera
@JaazCole: "你不能在聚合函数内部进行聚合。" 显然,你可以,至少如果你使用窗口函数的话。 - Mike Sherrill 'Cat Recall'
9
我认为这段代码只是执行了和“SELECT Sedol, MAX(Id) PriceId FROM Prices GROUP BY Sedol”相同的操作。第二个“MAX”似乎是对如何进行此操作的误解。@JaazCole,实际上这不会引发语法错误。 - Lamak
@Lamak 谢谢,我开始理解了。你帮了我很大的忙。 :) - František Škandera
显示剩余4条评论
2个回答

5
这相当于:
with x as (
  select
    Sedol,
    max(id) max_id,
    Max(ValueDate) max_valuedate
  from
    Prices
  group by
    Sedol
) select
  Sedol,
  max(max_id) over (partition by Sedol, max_valuedate) PriceId
from
  x;

虽然就像Lamak所说的,我看不出这不会只是相当于

SELECT Sedol, MAX(Id) PriceId FROM Prices GROUP BY Sedol

SQL Fiddle


1
我认为Lamak已经解释了SQL,我在这里提供一个例子以便理解。您可以看到这两个SQL语句产生相同的结果。请将以下代码复制并粘贴到SQL Server中尝试:
declare @Prices table (Id int, ValueDate datetime, Sedol int)

Insert into @Prices values (1,'2014-09-06' ,200),
(2,'2014-09-07' , 100),
(3,'2014-09-08' , 100),
(4,'2014-09-09' , 100),
(5,'2014-09-10' , 300),
(6,'2014-09-11' , 300),
(7,'2014-09-12' , 100),
(8,'2014-09-13' , 200),
(9,'2014-09-14' , 200),
(10,'2014-09-15' , 200)

Select * from @Prices

-- Your SQL
SELECT pp.Sedol
    ,MAX(MAX(Id)) OVER (
        PARTITION BY pp.Sedol
        ,MAX(pp.ValueDate)
        ) PriceId
FROM @Prices pp
GROUP BY pp.Sedol

-- Simple SQL mentioned by Lamak
SELECT Sedol, MAX(Id) PriceId FROM @Prices GROUP BY Sedol

结果集:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接