【问题标题】:MySQL Selecting MAX total with date and IDMySQL 使用日期和 ID 选择 MAX 总计
【发布时间】:2013-08-09 19:00:19
【问题描述】:

我有一个 cron 脚本,每天将活跃用户总数写入一个表。我现在正在尝试生成一个简单的报告,该报告将显示每个月的“高水位线”。由于某些帐户在当月到期,因此最高数字可能不是在月底。

这是我的表结构示例

tblUserLog
-----------
record_id   INT(11)   // PRIMARY KEY
run_date    DATE      // DATE RUN
ttl_count   INT(11)   // TOTAL FOR DAY

样本数据:

record_id      run_date      ttl_count
1              2013-06-01    500
2              2013-06-10    510
3              2013-06-20    520
4              2013-06-30    515
5              2013-07-01    525
6              2013-07-10    530
7              2013-07-20    540
8              2013-07-31    550
9              2013-08-01    560

我想要返回的是:

record_id   run_date        ttl_count
3           2013-06-20      520
8           2013-07-31      550
9           2013-08-01      560

我尝试了两个接近的查询...

// This will give me the total for the first of the month
SELECT s.record_id, s.run_date, s.ttl_count
FROM tblStatsIndividual s
JOIN (
    SELECT record_id
    FROM tblStatsIndividual
    GROUP BY DATE_FORMAT(run_date, '%Y %m')
    HAVING MAX(ttl_count)
) s2
ON s2.record_id = s.record_id
ORDER BY run_date DESC

这将返回每个月第一天的总计,以及总计的记录 ID 和正确日期。

试过这个...

SELECT record_id,max(run_date), max(ttl)
FROM (
    SELECT record_id,run_date, max(ttl_count) AS ttl
    FROM tblStatsIndividual
    GROUP BY DATE_FORMAT(run_date, '%Y %m')
) a 
GROUP BY DATE_FORMAT(run_date, '%Y %m')
ORDER BY run_date DESC

这似乎获得了正确的“高水位标记”,但它没有返回记录 ID 或高水位标记行的 run_date。

如何获得最高总数的record_id和run_date?

【问题讨论】:

    标签: mysql reporting max


    【解决方案1】:

    类似

    Select detail.Record_ID, detail.Run_Date, detail.ttl_Count
    From tblStatsIndividual detail
    Inner Join
    (Select Year(run_date) as Year, Month(Run_date) as Month, Max(ttl_count) as ttl
    From tblStatsIndividual
    Group By Year(run_date), Month(Run_date)) maximums
    On maximums.Year = Year(detail.Run_date) and maximums.Month = Month(detail.Run_date)
    and maximums.ttl = detail.ttl_count
    

    应该这样做。 NB 根据您的要求,如果您在同一个月有两条记录具有相同(并且是当月最高)ttl_count,它们都将被返回。

    【讨论】:

    • 当我运行这个查询时,它每天都会给我。不过,我只想要每月/每年最高的……
    【解决方案2】:

    根据@Tony Hopkinson 的帮助,此查询为我提供了信息。需要注意的是它显示了第一次出现 MAX 总计的 ID 和日期,因此如果总计在一个月内连续三天相同,则返回第一天的 ID。就我而言,最后一个 ID 会更理想,但我可以接受:

    SELECT s.Record_ID, s.Run_Date, s.ttl_Count
    FROM tblStatsIndividual s
    INNER JOIN (
        SELECT YEAR(run_date) AS yr, MONTH(run_date) AS mon, MAX(ttl_count) AS ttl
        FROM tblStatsIndividual
        GROUP BY DATE_FORMAT(run_date, '%Y %m')
     ) maximums
     ON maximums.yr = YEAR(s.run_date) 
        AND maximums.mon = MONTH(s.run_date) 
        AND maximums.ttl = s.ttl_Count
    GROUP BY ttl_count
    ORDER BY run_date DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 2022-01-19
      • 2015-06-01
      • 2013-04-02
      • 2013-07-26
      • 2011-05-12
      • 1970-01-01
      相关资源
      最近更新 更多