将select值除以找到的第一个条目

kx5bkwkv  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(357)

我对sql相当缺乏经验,我有一个类似这样的表(简化版):

ID | Dataset | date | value

我试图用一个基线来划分每个值,这将是该特定数据集在数据库中的第一个条目。
例如,对于dataset1,如果2018年5月5日的值是28,而2018年1月1日数据库中的第一个值是4,那么我希望结果是28/4。
问题是并不是每个数据集都同时添加到数据库中,所以它们的基线日期不同。因此,如果dataset1的第一个条目是在2018年1月1日,那么dataset2的第一个条目可能是在2018年2月2日。
我该如何处理这个问题?我尝试了一个简单的div,但似乎我只能除以一个数字,而不是一个value-by-value表。
我试过这样的方法:

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希望分母在本例中是单个值,而不是表。

fdbelqdn

fdbelqdn1#

看看这个:

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
        )
r6vfmomb

r6vfmomb2#

“我认为sql希望分母在这种情况下是一个单一的值,而不是一个表。”您的思路是正确的,因此sub select需要返回一个单一的值,下面是一个示例:

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
of1yzvn4

of1yzvn43#

在mysql 8+中,您只需执行以下操作:

select t.*,
       t.value / first_value(t.value) over (partition by t.dataset order by t.date) as ratio
from t;

相关问题