为什么count(column_name)的行为如下?

时间:2015-05-20 04:27:47

标签: mysql sql database group-by

考虑客户是主键并且没有空值的关系帐户(客户,余额)。

我想根据不断减少的余额对客户进行排名。 (具有最大余额的客户获得排名1.关系没有中断但排名被跳过:如果正好两个客户拥有最大余额,则每个客户获得排名1而排名2未被分配。)

为什么以下查询永远不会打印排名为1的客户?

    select A.customer, 1+count(B.customer) 
    from account A, account B 
    where A.balance < B.balance 
    group by A.customer 

SQLfiddle Link

4 个答案:

答案 0 :(得分:2)

让我们试试这个Example

排名不跳过排名

set @number:=0;
set @balance:=0;

select customer, balance, rank 
from (
  select 
    *, 
    @number:=if(@balance=balance, @number, @number+1) as rank,
    @balance:=balance
  from account
  order by balance
) as rankeddata;

<强>结果

customer balance rank
S        300     1
Q        400     2
R        400     2
P        500     3

显示500的排名 - &gt; 300,只需将ORDER BY balance更改为ORDER BY balance DESC

即可

如果多行具有相同的排名,则跳过排名

如果您希望跳过指定的排名,可以稍微调整一下SQL Fiddle

set @number:=0;
set @balance:=0;
set @rank_reused:=0;

select customer, balance, rank
from (
  select 
    *, 
    @number:=if(@balance=balance, @number, @number+1+@rank_reused) as rank,
    @rank_reused:=if(@balance=balance, @rank_reused+1, 0) as reused,
    @balance:=balance
  from account
  order by balance desc
) as rankeddata;

<强>结果

customer balance rank
S        300     1
Q        400     2
R        400     2
P        500     4

答案 1 :(得分:1)

这与伯爵无关。

您正在A和B之间进行连接,并仅显示A.balance&lt;的记录。 B.balance,因为你的顶级客户没有这样的记录(根据定义,没有更高余额的账户)你没有得到任何记录。

这应该可以解决问题

select A.customer, ( 
    select count(*) + 1 
    from account B
    where A.balance < B.balance
) from account A

答案 2 :(得分:0)

以下声明将根据其余额为您提供所有客户的排名:

SELECT A.customer, A.balance, ( 
    SELECT count(*)+1 
    FROM account B
    WHERE A.balance < B.balance
  ) AS rank
FROM account A ORDER BY A.balance DESC

结果将是:

customer balance rank
P   500 1 
Q   400 2 
R   400 2 
S   300 4

order by A.balance执行排序,而desc排名从最大到最小。最后,子查询提供排名(注意+1)。

这是一个示例fiddle

答案 3 :(得分:0)

尝试

select A.customer, 
(select count(*) from account) -
(select count(*) from account a1 where a1.balance<a.balance) rank
from account A
Order by rank