繁体   English   中英

MySQl-SQL-每天排名前5的记录

[英]MySQl - SQL - Top 5 records per day

关于下面的数据集,我试图每天获取MySQL数据库上的前5条记录。 这是网页访问量的表格,我的目的是找出访问量最高的5个页面。

我很乐意在给定的日期范围内仅获得前10名,但是却无法设法获得有关该主题的查询。

我确实尝试了以下

select 
    VISIT_DATE,
    group_concat(PAGE_ID order by NUM_VISITS desc separator ',') as pagehits
from 
    PAGEVISITS
where 
    VISIT_DATE >= '2015-07-01' and VISIT_DATE <= '2015-07-15'
group by
    VISIT_DATE

但我在这里无法获得SUM(NUM_VISITS) int,也无法group by VISIT_DATE之前进行group by这使其变得毫无用处。 除此以外,这就是我走了多远

select 
    VISIT_DATE,
    PAGE_ID,
    SUM(NUM_VISITS) as pagehits
 from
   PAGEVISITS
 where 
   VISIT_DATE >= '2015-01-01' and VISIT_DATE <= '2015-03-15'
 group by
   VISIT_DATE,
   PAGE_ID
order by
    pagehits desc
limit 5;

显然不是每天的前5名。 另外,可能有多个页面的页面命中次数明显相同,并且最终也可能出现在前5个页面之一,这就是为什么我尝试使用组concat显示所有其PAGE ID数的页面ID的原因。网页点击数是该天的前5个网页点击数。

我不是经验丰富的SQL程序员。 我能否要求协助以使此工作正常进行。 如果我在任何地方都听不清楚,请告诉我。

CREATE TABLE PAGEVISITS
    (`VISIT_DATE` date, `PAGE_ID` varchar(20),  `SERVER_NAME` varchar(50), `NUM_VISITS` int)
;

INSERT INTO PAGEVISITS
    (`VISIT_DATE`, `PAGE_ID`, `SERVER_NAME`, `NUM_VISITS`)
VALUES
('2015-01-01','2015A12123','A',10),
('2015-01-01','2015A12123','B',10),
('2015-01-01','2015A12124','A',30),
('2015-01-01','2015A12124','B',30),
('2015-01-01','2015A12125','A',40),
('2015-01-01','2015A12125','B',40),
('2015-01-01','2015A12126','A',1),
('2015-01-01','2015A12126','B',1),
('2015-01-01','2015A12127','A',0),
('2015-01-01','2015A12127','B',1),
('2015-01-01','2015A12128','A',40),
('2015-01-01','2015A12129','A',30),
('2015-01-01','2015A12134','A',45),
('2015-01-01','2015A12126','A',56),
('2015-01-01','2015A12167','A',23),
('2015-01-01','2015A12145','A',17),
('2015-01-01','2015A121289','A',12),
('2015-01-01','2015A121289','B',5),
('2015-01-02','2015A12123','A',3),
('2015-01-02','2015A12124','A',10),
('2015-01-02','2015A12125','A',70),
('2015-01-02','2015A12126','A',10),
('2015-01-02','2015A12127','A',100),
('2015-01-02','2015A12128','A',3),
('2015-01-02','2015A12128','B',2),
('2015-01-02','2015A12129','A',10),
('2015-01-02','2015A12134','A',5),
('2015-01-02','2015A12126','A',6),
('2015-01-02','2015A12167','A',3),
('2015-01-02','2015A12145','A',170),
('2015-01-02','2015A121289','A',34),
('2015-01-03','2015A12123','A',34),
('2015-01-03','2015A12124','A',14),
('2015-01-03','2015A12125','A',37),
('2015-01-03','2015A12126','A',23),
('2015-01-03','2015A12127','A',234),
('2015-01-03','2015A12128','A',47),
('2015-01-03','2015A12129','A',67),
('2015-01-03','2015A12134','A',89),
('2015-01-03','2015A12134','B',1),
('2015-01-03','2015A12126','A',97),
('2015-01-03','2015A12167','A',35),
('2015-01-03','2015A12145','A',0),
('2015-01-03','2015A121289','A',19), 
('2015-01-04','2015A12123','A',115),
('2015-01-04','2015A12124','A',149),
('2015-01-04','2015A12125','A',370),
('2015-01-04','2015A12126','A',34),
('2015-01-04','2015A12127','A',4),
('2015-01-04','2015A12128','A',70),
('2015-01-04','2015A12129','B',70),
('2015-01-04','2015A12134','A',70),
('2015-01-04','2015A12126','B',64),
('2015-01-04','2015A12167','A',33),
('2015-01-04','2015A12145','A',10);

预期的输出

在此处输入图片说明 在这里摆弄

如果要每天使用此表,则应考虑创建一个单独的表,并使用过程将数据填充其中。 还有更好的方法( 使用merge )。 这仅供您参考。

create table daily_results
(`VISIT_DATE` date, `PAGE_ID` varchar(20),  `SERVER_NAME` varchar(50), `NUM_VISITS` int);

CREATE PROCEDURE proc_loop_test( IN startdate  date,  in enddate  date)
BEGIN

     WHILE(startdate < enddate) DO
        insert into daily_results (select * from PAGEVISITS where VISIT_DATE=startdate order by NUM_VISITS desc limit 5);
        SET startdate = date_add(startdate, INTERVAL 1 DAY);
     end WHILE;
END;

用它来称呼它

call proc_loop_test(`2015-01-01`,`2015-03-15`);
select * from daily_results;

查询应该是

select sub.*,
        CASE WHEN @vd!=VISIT_DATE THEN @rn:=0 ELSE @rn:=@rn+1 END as row_num,
        @vd:=VISIT_DATE
from (
    select 
        VISIT_DATE,
        PAGE_ID,
        SUM(NUM_VISITS) as pagehits
     from
       PAGEVISITS
     where 
       VISIT_DATE >= '2015-01-01' and VISIT_DATE <= '2015-03-15'
     group by
       VISIT_DATE,
       PAGE_ID
     order by
        VISIT_DATE, pagehits desc) sub
having row_num<5

执行查询时,SQL小提琴以某种方式显示出某种内部错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM