我有下表:
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/