我有一个 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_id
和date
的总持续时间。
但是我在这里看不到变量的意义。我注意到您的查询中的注释行:
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/