mysql - 使用变量并重用它时,SELECT 语句无法正确显示数据

标签 mysql sql date sum window-functions

我有一个 mysql 查询,它将结果存储在变量中,但是当我稍后使用相同的变量时,它不会返回相同的值。我错过了什么吗?

SELECT 
    duration,
    @sum_duration := (SUM(duration) OVER (
        PARTITION BY user_id,`Date`
    )) as sum_duration,
    @sum_duration
    -- 9*3600*1000*(duration/@sum_duration) as normalized_duration
FROM duration_table

上述查询的结果是

'duration', 'sum_duration', '@sum_duration'
'86400000', '172800000',    '783413.000000000000000000000000000000'
'86400000', '172800000',    '783413.000000000000000000000000000000'
'86400000', '172800000',    '783413.000000000000000000000000000000'
'86400000', '172800000',    '172800000.000000000000000000000000000000'
'86400000', '172800000',    '172800000.000000000000000000000000000000'
'86400000', '172800000',    '172800000.000000000000000000000000000000'
'86400000', '172800000',    '172800000.000000000000000000000000000000'
'86400000', '172800000',    '172800000.000000000000000000000000000000'
'86400000', '172800000',    '172800000.000000000000000000000000000000'
'86400000', '172800000',    '172800000.000000000000000000000000000000'

最佳答案

这个查询看起来不错:

SELECT 
    duration,
    @sum_duration := (SUM(duration) OVER (PARTITION BY user_id,`Date`))
FROM duration

不带order by的窗口总和为您提供相同user_iddate的总持续时间。

但是我在这里看不到变量的意义。我注意到您的查询中的注释行:

SELECT
    duration
    @sum_duration := (SUM(duration) OVER (PARTITION BY user_id,`Date`)),
    9*3600*1000*(duration/@sum_duration) as normalized_duration --> here
FROM duration

但是,这可能无法按预期工作,因为 MySQL 不保证 SELECT 子句中表达式的计算顺序。

也许,您想要:

SELECT 
    duration,
    SUM(duration) OVER (PARTITION BY user_id,`Date`) sum_duration,
    9 * 3600 * 1000 * duration 
        / (SUM(duration) OVER (PARTITION BY user_id,`Date`)) normalized_duration    
FROM duration

您还可以使用嵌套子查询来表达这一点:

SELECT
    t.*,
    9 * 3600 * 1000 * duration / sum_duration normalized_duration
FROM (
    SELECT 
        duration,
        SUM(duration) OVER (PARTITION BY user_id,`Date`) sum_duration    
    FROM duration
) t

关于mysql - 使用变量并重用它时,SELECT 语句无法正确显示数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59591059/

相关文章:

php - 这是什么意思?我该如何解决?未捕获的异常 'PDOException',消息为“SQLSTATE[42000]

mysql - mysql从5.5升级到5.6后查询慢

javascript - 获取每个动态创建的输入元素的动态值并将它们分配给单独的变量

mysql - 读取9GB的SQL脚本文件

php - 具有一个值和另一个值的记录之间的 TIMEDIFF(),而不仅仅是一个

mysql - 合并具有相同 prod_id 的 SQL 列和数据

javascript - 无法使 moment().utc() 返回 2 位数的月份和年份

java - 使用 SS::MM::HH MM/DD/YY/格式按日期对对象数组列表进行排序

Mysql 字符集和形式

php 将日期转换为时间戳