在PostgreSQL中使用INNER JOIN时出错?

时间:2018-08-14 04:58:09

标签: sql postgresql join subquery

由于我是PostgreSQL的新手,所以我正在使用PostgreSQL sample database学习和练习PostgreSQL。我的问题陈述是要查找在4月10日至13日期间租借电影的前15名支出最高的客户的付款?我的查询如下:

function vq = Linear2dInterpWithClipExtrap(x,y,v,xq,yq);

    vq = interp2(x,y,v,xq,yq);

    [XMax, idxVMax] = max(x);
    [XMin, idxVMin] = min(x);

    idxMax = xq > XMax;
    idxMin = xq < XMin;
   if ~isempty(yq(idxMax));
    vq(idxMax) = LinearInterpWithClipExtrap(y,v(:,idxVMax),yq(idxMax));
   end
   if ~ isempty(yq(idxMin))
    vq(idxMin) = LinearInterpWithClipExtrap(y,v(:,idxVMin),yq(idxMin));
   end

   [YMax, idyVMax] = max(y);
    [YMin, idyVMin] = min(y);

    idyMax = yq > YMax;
    idyMin = yq < YMin;
   if ~isempty(xq(idyMax));
    vq(idyMax) = LinearInterpWithClipExtrap(x,v(idyVMax,:),xq(idyMax));
   end
   if ~ isempty(xq(idyMin));
    vq(idyMin) = LinearInterpWithClipExtrap(x,v(idyVMin,:),xq(idyMin));
   end



function vq = LinearInterpWithClipExtrap(x,v,xq);

    vq = interp1(x,v,xq);

    [XMax, idxVMax] = max(x);
    [XMin, idxVMin] = min(x);

    idxMax = xq > XMax;
    idxMin = xq < XMin;

    vq(idxMax) = v(idxVMax);
    vq(idxMin) = v(idxVMin

我遇到以下错误:

SELECT customer.first_name,payment.amount
FROM customer
  INNER JOIN payment ON customer.customer_id = payment.customer_id
WHERE customer_id IN (SELECT customer_id 
                      FROM (
                        SELECT customer_id, SUM(amount)
                        FROM payment
                        WHERE extract(month from payment_date) = 4
                        AND extract(day from payment_date) BETWEEN 10 AND 13
                        GROUP BY customer_id
                        HAVING SUM(amount) > 5
                        ORDER BY SUM(amount) DESC
                        LIMIT 15
                      ) AS top_fifteen);

我不确定为什么在这里会出现此异常,有人可以在这里帮助我缓解此问题吗?任何线索都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

使用表别名,如下所示,并尝试

SELECT c.first_name,p.amount
FROM customer c
INNER JOIN payment p
ON c.customer_id = p.customer_id
WHERE c.customer_id IN 
(
SELECT customer_id FROM 
    (
SELECT  customer_id, SUM(amount)
FROM payment
WHERE extract(month from payment_date) = 4
AND extract(day from payment_date) BETWEEN 10 AND 13
GROUP BY customer_id
HAVING SUM(amount) > 5
ORDER BY SUM(amount) DESC
LIMIT 15) AS top_fifteen);

我如下重写查询

select * from
 (
 select  c.first_name,c.last_name,
 sum(amount) as pay_amount,
 count(p.customer_id) pay_num from payment p
 inner join Customer c on  p.customer_id=c.customer_id
     where extract(month from p.payment_date) = 4
AND extract(day from p.payment_date) BETWEEN 10 AND 13
 group by c.first_name,c.last_name,p.customer_id
 ) T 
 order by pay_amount desc
 Limit 15