【问题标题】:SQL sum one value for each unique value from another columnSQL 为来自另一列的每个唯一值求一个值
【发布时间】:2015-01-22 04:39:16
【问题描述】:

如果我有这样的表:

------------------------------
|id    |duration |date       |
|1     |20       |1392479451 |<--
|2     |20       |1392479451 |
|3     |10       |1392478620 |<--
|4     |30       |1392479457 |<--
|5     |30       |1392479457 |
|6     |30       |1392479457 |
------------------------------

我只想SUM每个唯一date中的第一个:

----------------
|SUM(duration) |
|60            |
----------------

请问我该怎么做?

【问题讨论】:

  • 您需要在查询时使用group by date

标签: mysql sql


【解决方案1】:

应该这样做:

SELECT SUM(duration) FROM (
    SELECT duration FROM tbl GROUP BY date
) t;

内部查询中的GROUP BY 将在每个不同日期仅选择一行。未定义将选择哪一行,但这并不重要,因为持续时间应该相同。然后我们只需对持续时间求和。

编辑:为了清楚起见,这不会选择第一个持续时间,而是任何给定日期的单个持续时间。如果持续时间在一个日期内可能不同,而您特别需要第一个,这将无法解决您的问题。

【讨论】:

  • 这使用了文档明确警告不要使用的 MySQL 扩展。在子查询中,不能保证durationdate 的“第一条”记录。
  • @GordonLinoff 我想我很清楚这一点。我的理解是duration 在给定日期内不会发生变化。
  • 。 .问题中没有任何内容表明 duration 对于每个日期都必须是唯一的。如果是这样,您不妨group by date, duration 并避免使用非标准 SQL。
  • @GordonLinoff 样本数据表明了这一点。至于非标准 SQL 的使用,我想说这最终是一个偏好问题。就个人而言,我使用它很舒服,而且我更喜欢较短的 GROUP BY 语法。
【解决方案2】:

你需要得到第一次约会。有几种方法,但由于 MySQL 支持将字符串静默转换为数字,您可以使用 substring_index()/group_concat() 技巧——只要每个日期的值不会导致中间字符串溢出(您需要很多值)。

以下应该做你想要的:

select sum(duration + 0)
from (select substring_index(group_concat(duration order by id), ',', 1) as duration
      from table t
      group by date
     ) t;

否则,您需要额外的join

select sum(duration)
from table t join
     (select min(id) as id
      from table t
      group by date
     ) tt
     on t.id = tt.id;

【讨论】:

    【解决方案3】:

    你可以试试这样的:

    SELECT SUM(IF(`date` = ( SELECT MIN(`date`) FROM table WHERE `date` = t.`date`), `duration`, 0))    
    FROM `table` t
    

    或者

    SELECT SUM(t1.`duration`) 
    FROM `table` t1 
    JOIN ( SELECT MIN(`id`) AS `id` FROM `table` GROUP BY `date` ) t2 ON t1.`id` = t2.`id`
    

    【讨论】:

      【解决方案4】:

      你可以试试这个:

      SELECT 
          SUM(duration)
      FROM
          datetable d,
          (SELECT 
              date, MIN(id) AS id
          FROM
              datetable
          GROUP BY date) d2
      WHERE
          d.id = d2.id;
      

      【讨论】:

        【解决方案5】:

        Trying to sum distinct values SQL:

        SELECT SUM(duration) FROM 
           (SELECT DISTINCT date, duration FROM table)
        

        【讨论】:

          猜你喜欢
          • 2018-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-07
          • 2021-06-12
          • 2023-02-01
          • 2018-08-05
          • 2015-02-12
          相关资源
          最近更新 更多