sql - 根据最大列值对唯一行进行分组

标签 sql sql-server t-sql

我有下表:

query   | update_date | website_id | device  | page    | impressions | clicks | position
--------+-------------+------------+---------+---------+-------------+--------+----------
kitchen | 2018-05-01  | 2          | desktop | http... | 11000       | 50     | 3
table   | 2018-05-01  | 2          | desktop | http... | 7000        | 40     | 3
kitchen | 2018-05-02  | 2          | desktop | http... | 11500       | 55     | 3
table   | 2018-05-02  | 2          | desktop | http... | 7100        | 35     | 3

我想要生成一个输出,其中针对每个唯一的查询,我可以获得关于点击的最佳性能行。上表应给出以下输出:

query   | update_date | website_id | device  | page    | impressions | clicks | position
--------+-------------+------------+---------+---------+-------------+--------+----------
table   | 2018-05-01  | 2          | desktop | http... | 7000        | 40     | 3
kitchen | 2018-05-02  | 2          | desktop | http... | 11500       | 55     | 3

到目前为止我所拥有的是:

select 
    q.* 
from
    (select 
         query, 
         max(clicks) as clicks 
     from 
         search_console_query   
     where 
         update_date >= '2018-05-01' and 
         update_date <= '2018-05-31' and 
         website_id = 2 
     group by query) as t
inner join 
    search_console_query q on q.query = t.query and q.clicks = t.clicks

这无法按预期工作,因为如果两行的点击量相同,我会得到多行。谁能帮我解决这个问题吗?

最佳答案

尝试一下。

DECLARE @table AS TABLE (query NVARCHAR(MAX)
                        ,update_date DATE
                        ,website_id INT
                        ,device NVARCHAR(MAX)
                        ,page NVARCHAR(MAX)
                        ,impressions INT
                        ,clicks INT
                        ,POSITION INT
                        )
INSERT  INTO @table
VALUES  ('kitchen', '2018-05-01', 2, 'desktop', 'http...', 11000, 50, 3),
        ('table  ', '2018-05-01', 2, 'desktop', 'http...', 7000, 40, 3),
        ('kitchen', '2018-05-02', 2, 'desktop', 'http...', 11500, 55, 3),
        ('table  ', '2018-05-02', 2, 'desktop', 'http...', 7100, 35, 3);
WITH    cte
          AS (SELECT    *
              ,         ROW_NUMBER() OVER (PARTITION BY query ORDER BY clicks DESC) RN
              FROM      @table
             )
    SELECT  cte.query
     ,      cte.update_date
     ,      cte.website_id
     ,      cte.device
     ,      cte.page
     ,      cte.impressions
     ,      cte.clicks
     ,      cte.POSITION
    FROM    cte
    WHERE   RN = 1

应该足够接近。

每个查询仅显示一行,如果需要,您可以调整顺序来决定应优先考虑哪一行。

向分区添加更多字段将允许您按其他选项进行分组。例如按每月查询分组等。

关于sql - 根据最大列值对唯一行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51102498/

相关文章:

sql - 从表中删除第 n 行(postgresql)

mysql - 使用mysql在一个查询中选择多个表中的 child 总数

sql - 在没有第三个变量的情况下切换SQL Server中两个字段/列的值

SQL Server 2000 带参数的存储过程分支

T-SQL——将逗号分隔列转换为多列

json - 用于分层 JSON 的 T-SQL

MySQL简单连接避免多个重复行

sqlite3 时间戳列

sql - 是否可以为表中的所有列生成哈希值?

sql - ORDER BY 几列中的 CASE