Группировка уникальных строк по максимальному значению столбца - PullRequest
0 голосов
/ 29 июня 2018

У меня есть следующая таблица:

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

Я хочу сделать вывод, в котором я получу наиболее эффективную строку в отношении clicks для каждого уникального query. Таблица выше должна дать следующий вывод:

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

Это не работает должным образом, так как я получаю несколько строк, если две строки имеют одинаковое количество кликов. Может ли кто-нибудь помочь мне понять это?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Попробуйте.

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

Должно быть достаточно близко.

Будет отображаться только одна строка для запроса, и вы можете изменить порядок, чтобы решить, какой строке следует присвоить приоритет при необходимости.

Добавление дополнительных полей в раздел позволит вам группировать по другим параметрам. например группировка по запросу в месяц и т. д.

0 голосов
/ 29 июня 2018

Вы можете использовать функцию row_number() с TIES :

select top (1) with ties *
from search_console_query s
where . . .
order by row_number() over (partition by query order by click desc);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...