3

テーブル内のすべての「メール」行をカウントし、頻度に基づいてすべての値を返すクエリを実行したいと考えています。ただし、結果をグループ化したくはありません。結果のすべてのバリエーションを表示したいのですが、これまでのところ、頻度で並べ替えられていますが、グループごとにマージされていることがわかります。表示したいだけですそれらはすべて、頻度の順です。

select email 
from uploads 
group by email
order by count(*) desc

SQL -

CREATE TABLE uploads 
(
 email varchar(200)
);

INSERT INTO uploads
(email)
VALUES
('test@email.com'),
('test@email.com'),
('test@email.com'),
('test2@email.com'),
('test2@email.com'),
('test3@email.com'),
('test4@email.com');

これが私が望む結果です

|              EMAIL |
----------------------
|    test@email.com  |
|    test@email.com  |
|    test@email.com  |
|    test2@email.com |
|    test2@email.com |
|    test3@email.com |
|    test4@email.com |
4

1 に答える 1

6

COUNT()電子メールごとの集計を返し、降順で並べ替えるサブクエリに対して結合できます。

SELECT 
  uploads.EMAIL
FROM
  uploads 
  JOIN (
    /* subquery returns distinct emails and their aggregate COUNT() */
    /* JOIN matches every row in `uploads` to the email and count */
    SELECT EMAIL, COUNT(*) as num FROM uploads GROUP BY EMAIL
  ) c ON uploads.EMAIL = c.EMAIL
ORDER BY 
  c.num DESC, 
  EMAIL ASC

実際には、これは次のような結果を生成しますが、実際にはリストにnum列を含めません。SELECT

|              EMAIL | num |
----------------------------
|    test@email.com  | 3
|    test@email.com  | 3
|    test@email.com  | 3
|    test2@email.com | 2
|    test2@email.com | 2
|    test3@email.com | 1
|    test4@email.com | 1
于 2012-09-07T15:42:12.170 に答える