使用sql确定数据集中的更改率

使用sql确定数据集中的更改率,sql,Sql,假设我有一个包含以下数据的表: 第1天项目1 30 第1天项目2 25 第1天项目3 27 第2天项目1 30 第2天项目2 30 第2天项目3 20 ... dayN项目1 20 我将如何构造一个查询,该查询可以为我提供每天每个项目的变化率 第1天项目1更改率:0 第1天项目2变更率:-1 第1天第3项变更率:5 第2天项目1变更率:0 第2天项目2变更率:2 在不太了解sql的情况下,我最初的想法是每天循环一次,并有一个子查询检查前一天的每一项,并做一些改变 谢谢如果您的表被称为带有日期、项

假设我有一个包含以下数据的表:

第1天项目1 30 第1天项目2 25 第1天项目3 27 第2天项目1 30 第2天项目2 30 第2天项目3 20 ... dayN项目1 20

我将如何构造一个查询,该查询可以为我提供每天每个项目的变化率

第1天项目1更改率:0 第1天项目2变更率:-1 第1天第3项变更率:5 第2天项目1变更率:0 第2天项目2变更率:2

在不太了解sql的情况下,我最初的想法是每天循环一次,并有一个子查询检查前一天的每一项,并做一些改变


谢谢

如果您的表被称为带有日期、项目和值整数列的datatable,这可能就可以了

SELECT t1.day, t1.item, (t2.value - t1.value) as rate
FROM datatable t1
INNER JOIN datatable t2
ON t1.item = t2.item 
AND t1.day + 1 = t2.day

若您的表被称为datatable,包含一个day、item和value整数列,那个么这就可以了

SELECT t1.day, t1.item, (t2.value - t1.value) as rate
FROM datatable t1
INNER JOIN datatable t2
ON t1.item = t2.item 
AND t1.day + 1 = t2.day

适用于大多数现代DBMS的标准SQL解决方案

SELECT day, 
       item, 
       value, 
       value - lag(value) over (partition by item order by day) as diff_to_prev
FROM your_table
ORDER by day, item

适用于大多数现代DBMS的标准SQL解决方案

SELECT day, 
       item, 
       value, 
       value - lag(value) over (partition by item order by day) as diff_to_prev
FROM your_table
ORDER by day, item


听起来像是在客户端应用程序中更容易做的事情。哪个DBMS?我之所以这么问,是因为在PostgreSQL或Oracle中有比在MySQL中更聪明的方法。另外-您的表是否真的包含“day1”和“day2”等值?如果是这样的话,听起来我们必须从这些值中提取数字?你从哪里得到0,-1,5,0,2?滞后函数ftw如果你的引擎支持它的声音,就像在客户端应用程序中更容易做到的一样。哪个DBMS?我之所以这么问,是因为在PostgreSQL或Oracle中有比在MySQL中更聪明的方法。另外-您的表是否真的包含“day1”和“day2”等值?如果是这样的话,听起来我们必须从这些值中提取数字?你从哪里得到0,-1,5,0,2?滞后函数ftw如果你的引擎支持它只是一个注意:如果你不想记录某个特定项目的最后一天,这个方法就行了。如果您只有该项目一天的记录,那么它根本不会返回该项目的任何行。如果将join保留到t2,则每个项目每天都有一行,如果是最后一天,则rate为NULL。@JeremyPridemore是的,这取决于什么结果对您的需要更有意义。但是,如果您确实希望使用左联接每天都有一行,那么您还必须更改计算速率的方式,以处理t2.value的空值。请注意:如果您不希望某个特定项处于打开状态的最后一天的记录,则此方法有效。如果您只有该项目一天的记录,那么它根本不会返回该项目的任何行。如果将join保留到t2,则每个项目每天都有一行,如果是最后一天,则rate为NULL。@JeremyPridemore是的,这取决于什么结果对您的需要更有意义。但是,如果您确实希望每天使用左联接生成一行,则还必须更改计算速率的方式,以处理t2.value的空值。大多数现代DBMS->SQL 2012+@ScottLenart:这是在SQL:2006标准中引入的,而不是根据我找到的任何文章所述的2012@ScottLenart:该链接指的是一个名为SQL Server的产品,而不是名为SQL:2006Most modern DBMS->SQL 2012+@ScottLenart的SQL标准:这是在SQL:2006标准中引入的,而不是根据我找到的任何文章来看的2012@ScottLenart:该链接指的是一个名为SQL Server的产品,而不是名为SQL:2006的SQL标准