我有这个SQL查询应该找到某个厨师的等级。 我应该计算这个厨师做的食谱数量,计算出的数量 其他厨师食谱,最终目标是让我们的厨师排名, 这是他做的食谱较少的厨师数量。 (对不起我的英语不好以及冗长的解释)。
查询:
/*Compute Cooking Rank*/
create or replace function
ComputeCookingRank(u integer)
returns integer as $$
declare
uidSum record;
uSum integer;
ranking integer;
begin
select distinct uid,count(uid) as "sum" into uidSum from HasCooked group by uid;
---> select distinct into uSum from uidSum where uid=u;
select count(uid) into ranking from uidSum where uid=u and sum<uSum;
end;
$$ language plpgsql;
有问题的线是带箭头的线;是否可以从“记录”类型中获取数据 像这样的变量? 我在这里做错了什么?
答案 0 :(得分:2)
select distinct /* you list no columns here */ into uSum from uidSum where uid=u;
答案 1 :(得分:1)
首先,您不需要plpgsql函数。一个普通的查询完成这项工作。在这种情况下,CTE会有所帮助:
WITH x AS (
SELECT uid, count(*) as ct
FROM hascooked
GROUP BY uid
)
SELECT count(*) AS cooks_with_fewer_recipies
FROM x
WHERE ct < (SELECT ct FROM x WHERE uid = u);
接下来,使用此声明数量错误:
select distinct uid,count(uid) as "sum" into uidSum from HasCooked group by uid;
这些观点只是我的建议,并非严格错误:
您已经 GROUP BY uid
, DISTINCT
在这种特殊情况下毫无意义。
请勿使用函数名称(sum
)作为列名。只会导致问题。
使用正确的名称,您不需要双引号("sum"
)。只是我的建议,并非严格错误。
您可以使用混合大小写标识符,但不能。如果不是双引号,标识符将折叠为小写。 Read about identifiers in the manual
与GROUP BY uid
一样,最好使用count(*)
代替count(uid)
。 <{1}}可能是uid
的(不太可能?)情况稍快一点,效果更好 - 那么你也得到NULL
个案例的计数。
清理表单(仍然错误!):
NULL
该陈述仍然有误,因为您尝试将多行分配给单个变量SELECT uid, count(*) as ct INTO uidSum
FROM hascooked
GROUP BY uid;
,这是不可能的。
uidSum
可以包含多列,而不是多行。您需要record
或将行汇总为一个。
只会分配第一行,因为您没有table
,所以会选择随机。 ORDER BY
用于保证结果集按DISTINCT
列排序,但自8.4版以来不再适用。我引用release notes for 8.4
SELECT DISTINCT和UNION / INTERSECT / EXCEPT不再总是产生 排序输出(汤姆)
在任何情况下,按DISTINCT
排序与在此上下文中检索单行一样无意义。这显然不是你想要的。另一种方法是逐个遍历生成的行。 More about loops here
正确的解决方案是我上面的查询。