MySQl - SQL - 每天前5个记录

时间:2016-04-01 12:34:41

标签: mysql sql

关于下面的数据集,我试图在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&amp;我无法获得group by VISIT_DATE`,这使得它变得毫无用处。除此之外,这就是我有多远

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。此外,可能有多个页面最终会显示相同数量的页面命中率。也可能最终出现在前五名之一,这就是为什么我尝试使用group concat来显示所有那些页面点击次数在当天前5页点击次数中的PAGE ID。

我不是经验丰富的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);

预期的输出

enter image description here  小提琴here

2 个答案:

答案 0 :(得分:1)

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

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;

答案 1 :(得分:0)

查询应为

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小提示在执行查询时会显示一些内部错误。