简体   繁体   English

在单个响应/查询中获取不同日期范围的平均评分

[英]Get average ratings for different date ranges in a single response / query

So I have 4 separate MySQL queries that I use to get ratings: 所以我有4个单独的MySQL查询用于获取评级:

    -- Get average rating for this week, and a count of each rating
    select my_user as Login, EXTRACT(WEEK from (update_date)) as 'WeekNo', 
    COUNT(CASE WHEN rating = 1 THEN 1 ELSE NULL END) AS '1-Stars', 
    COUNT(CASE WHEN rating = 2 THEN 1 ELSE NULL END) AS '2-Stars', 
    COUNT(CASE WHEN rating = 3 THEN 1 ELSE NULL END) AS '3-Stars',
    COUNT(CASE WHEN rating = 4 THEN 1 ELSE NULL END) AS '4-Stars',
    COUNT(CASE WHEN rating = 5 THEN 1 ELSE NULL END) AS '5-Stars', 
    round(avg(rating),2) as 'WeekAvg' 
    from rating_table where my_user IN ('u1','u2','u3')  
    AND EXTRACT(YEAR from (update_date)) = 2016 
    AND EXTRACT(WEEK from (update_date)) = (WEEKOFYEAR(NOW()) - 1)
    GROUP BY 1 ORDER BY 1;

    -- get the average rating for the past 90 days
    SELECT my_user as 'Login', round(avg(rating),2) as '90-day' 
    FROM rating_table
    WHERE update_date BETWEEN NOW() - INTERVAL 90 DAY AND NOW() 
    AND my_user in ('u1','u2','u3') 
    GROUP BY 1;

    -- get the average rating for Year to date
    SELECT my_user as 'Login', round(avg(rating),2) as 'YTD' 
    FROM rating_table 
    WHERE (update_date BETWEEN '2016-01-01 00:00:00' AND NOW())
    AND my_user in ('u1','u2','u3') 
    GROUP BY 1;

    -- get the average rating for the past 365 days
    SELECT my_user as 'Login', round(avg(rating),2) as '365-day' 
    FROM rating_table
    WHERE update_date BETWEEN NOW() - INTERVAL 365 DAY AND NOW() 
    AND my_user in ('u1','u2','u3') 
    GROUP BY 1;

I've tried various approaches to get these into a single query / table, but I just can't get these working. 我已经尝试了各种方法将它们放入单个查询/表中,但我无法让这些工作。 This is how I'd like the output to appear: 这就是我想要输出的方式:

    +----------+--------+---------+---------+---------+---------+---------+---------+--------+------+---------+
    | Agent    | WeekNo | 1-Stars | 2-Stars | 3-Stars | 4-Stars | 5-Stars | WeekAvg | 90-day | YTD  | 365-day |
    +----------+--------+---------+---------+---------+---------+---------+---------+--------+------+---------+
    | u1       |     26 |       0 |       0 |       0 |       0 |       6 |    5.00 |   5.00 | 5.00 |    5.00 |
    | u2       |     26 |       0 |       0 |       0 |       1 |       9 |    4.90 |   4.90 | 4.90 |    4.90 |
    | u3       |     26 |       0 |       0 |       0 |       0 |       1 |    5.00 |   5.00 | 5.00 |    5.00 |
    +----------+--------+---------+---------+---------+---------+---------+---------+--------+------+---------+

I've tried: 我试过了:

  • SELECT * FROM (q1 UNION q2 etc) SELECT * FROM(q1 UNION q2等)
  • Nested select queries 嵌套选择查询
  • Subqueries using different date ranges 使用不同日期范围的子查询

These queries are run against a read-only table, so I am limited in the methods I can use. 这些查询是针对只读表运行的,因此我可以使用的方法受到限制。

I know I'm close to the answer, but it's just not clicking for me. 我知道我接近答案,但它不是为了点击我。 Anyone able to offer some advice on this? 有人能提出一些建议吗?

Did you try to do it with LEFT JOIN? 你试着用LEFT JOIN做的吗?

hint: 暗示:

FROM rating_table rt
LEFT JOIN  rating_table as rt90 ON rt.my_user = rt90.my_user ... 
LEFT JOIN  rating_table as rtY ON rt.my_user = rtY.my_user ... 
LEFT JOIN  rating_table as rt365 ON rt.my_user = rt365.my_user ...

You can simply join them as different sub-query: 您可以简单地将它们作为不同的子查询加入:

Select * from 
  (Select * from ... /*your 1st query*/ ) t1
 Join (Select * from ... /*your 2nd query*/ ) t2 
    on t1.Login=t2.login
 Join (Select * from ... /*your 3rd query*/ ) t3
    on t1.Login=t3.login
 Join (Select * from ... /*your 4th query*/ ) t4
    on t1.Login=t4.login

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

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