【问题标题】:MySql GROUP BY Max DateMySql GROUP BY 最大日期
【发布时间】:2018-03-21 02:39:58
【问题描述】:

我有一个名为 votes 的表,有 4 列:idnamechoicedate

****id****name****vote******date***
****1*****sam**********A******01-01-17
****2*****sam**********B******01-05-30
****3*****jon**********A******01-01-19

我的最终目标是统计所有选票,但我只想统计每人 1 票,特别是每个人最近的投票。

在上面的例子中,结果应该是 A 1 票,B 1 票。

这是我目前拥有的:

select name,
    sum(case when uniques.choice = A then 1 else 0 end) votesA,
    sum(case when uniques.choice = B then 1 else 0 end) votesB
FROM (
    SELECT id, name, choice, max(date)
    FROM votes
    GROUP BY name
) uniques;

但是,这不起作用,因为子查询确实选择了最大日期,但它不包括与该最大日期关联的正确 choice

【问题讨论】:

  • 你能发布预期的输出吗?
  • votesA--1.......votesB--1.... 我只在调试选择中包含name

标签: mysql sql join group-by max


【解决方案1】:

不要认为“分组依据”可以获得最近的投票。考虑加入或其他一些选择。这是一种方法:

SELECT v.name,
       SUM(v.choice = 'A') as votesA,
       SUM(v.choice = 'B') as votesB
FROM votes v
WHERE v.date = (SELECT MAX(v2.date) FROM votes v2 WHERE v2.name = v.name)
GROUP BY v.name;

Here 是一个 SQL Fiddle。

【讨论】:

  • 当我尝试这个时,我得到:unknown column v.name in WHERE clause.
  • name 根据您的问题在votes 表中,因此该列应该在那里。
  • 抱歉,我只是想看看子查询做了什么。我不太确定如何处理您的查询输出。这是一个包含 3 列的表:name、 votesA、 votesB。所以它包括山姆对 A 的投票和山姆对 B 的投票。
  • @Sam。 . .不,正如 SQL Fiddle 所展示的那样。我不知道你做错了什么。
【解决方案2】:

你的答案很接近,但需要JOINself

子查询按名称获取 Max 日期然后 JOIN 自我。

select
    sum(case when T.vote = 'A' then 1 else 0 end) votesA,
    sum(case when T.vote = 'B' then 1 else 0 end) votesB
FROM (
    SELECT name,Max(date) as date
    FROM T
    GROUP BY name
) AS T1 INNER JOIN T ON T1.date = T.date

SQLFiddle

【讨论】:

    【解决方案3】:

    试试这个

    SELECT
        choice,
        COUNT(1)
    FROM
        votes v
        INNER JOIN
        (
            SELECT
                id,
                max(date)
            FROM
                votes
            GROUP BY
                name
        ) tmp ON
        v.id = tmp.id
    GROUP BY
        choice;
    

    【讨论】:

      【解决方案4】:

      这样的事情(如果你真的需要只计算最后一票的人)

      SELECT 
        sum(case when vote='A' then cnt else 0 end) voteA,
        sum(case when vote='B' then cnt else 0 end) voteB
      FROM 
       (SELECT vote,count(distinct name) cnt
        FROM (
            SELECT name,vote,date,max(date) over (partition by name) maxd
            FROM votes
        ) 
        WHERE date=maxd
        GROUP BY vote
       )
      

      PS。 MySQL v 8

      【讨论】:

        【解决方案5】:
        select 
        name,
        sum( case when choice = 'A' then 1 else 0 end) voteA,
        sum( case when choice = 'B' then 1 else 0 end) voteB
        from
        (
        select id, name, choice
        from votes
        where date = (select max(date) from votes t2 
                        where t2.name = votes.name ) 
        ) t
        group by name
        

        或者只输出一行作为 VoteA 和 VoteB 的总数:

        select 
        sum( case when choice = 'A' then 1 else 0 end) voteA,
        sum( case when choice = 'B' then 1 else 0 end) voteB
        from
        (
        select id, name, choice
        from votes
        where date = (select max(date) from votes t2 
                        where t2.name = votes.name ) 
        ) t
        

        【讨论】:

          猜你喜欢
          • 2018-07-16
          • 1970-01-01
          • 1970-01-01
          • 2022-01-20
          • 1970-01-01
          • 1970-01-01
          • 2018-10-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多