我对SQL完全没有经验,并且我有一个看起来像这样的表(简化版):
ID | Dataset | date | value
我正在尝试将每个值除以基线,这将是数据库中该特定数据集的第一个条目。
例如,对于数据集1,如果2018年5月5日的值为28,而数据库中的第一个值是2018年1月1日的4,那么我希望结果为28/4。
问题是,并非每个数据集都同时添加到数据库中,因此它们的基线日期不同。因此,如果dataset1在2018年1月1日第一次进入,dataset2可能在2018年2月2日第一次进入。
我将如何处理该查询?我尝试了一个简单的div,但似乎只能将其除以一个数字,而不能按值对表进行除法。
我尝试过这样的事情:
SELECT DATE(date) as time, value, dataset / (
SELECT min(DATE(date)) as time, value, dataset FROM table GROUP BY dataset)
FROM table GROUP BY time, dataset
但是我认为SQL在这种情况下希望分母是单个值,而不是表。
答案 0 :(得分:3)
检查一下:
SELECT T1.Date
,T1.Value/T2.Value Value
FROM TempTable T1
INNER JOIN TempTable T2
ON T2.Id
=
(SELECT T2.Id
FROM TempTable T2
WHERE T1.Dataset=T2.Dataset
ORDER BY T2.Date
LIMIT 1
)
答案 1 :(得分:1)
“在这种情况下,我认为SQL期望分母是单个值,而不是表。”您处在正确的轨道上,因此子选择需要返回一个值,下面是一个示例:
SELECT
value, (select value from table b where a.dataset = b.dataset and b.dt = (select min(dt) from table c where b.dataset = c.dataset))
FROM
table a
答案 2 :(得分:1)
在MySQL 8+中,您只需执行以下操作:
select t.*,
t.value / first_value(t.value) over (partition by t.dataset order by t.date) as ratio
from t;