Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按组SQL获取以前的记录_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

按组SQL获取以前的记录

按组SQL获取以前的记录,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有下表: ID GROUPID ODATE OTIME OVALUE 1 A 2014-05-31 00:00:00 1207432.6 2 A 2014-05-31 01:00:00 1209064 3 A 2014-05-31 02:00:00 1210698 4 A 2014-05-31 03:00:00 1

我有下表:

ID  GROUPID     ODATE       OTIME       OVALUE
1   A           2014-05-31  00:00:00    1207432.6
2   A           2014-05-31  01:00:00    1209064     
3   A           2014-05-31  02:00:00    1210698     
4   A           2014-05-31  03:00:00    1212333.3   
5   A           2014-05-31  04:00:00    1213967.7   
6   B           2014-05-31  00:00:00    2110016     
7   B           2014-05-31  01:00:00    2110016     
8   B           2014-05-31  02:00:00    2110016     
9   B           2014-05-31  03:00:00    2110016     
10  B           2014-05-31  04:00:00    2110016     
11  C           2014-05-31  00:00:00    2326592.6   
12  C           2014-05-31  01:00:00    2328088.8
13  C           2014-05-31  02:00:00    2329590.3   
14  C           2014-05-31  03:00:00    2331094.5   
15  C           2014-05-31  04:00:00    2332598
然后我运行以下语法:

SELECT 
A.ID, A.GroupID, A.oDate, A.oTime, 
A.oValue, MAX(B.oValue) AS Prev_oValue, A.oValue - MAX(B.oValue) AS oResult
FROM
Table1 AS A LEFT OUTER JOIN Table1 AS B ON B.GroupID = A.GroupID AND B.oValue < A.oValue
GROUP BY
A.ID, A.GroupID, A.oDate, A.oTime, A.oValue
ORDER BY A.GroupID, A.oDate, A.oTime
查看

我想要的是,基于GroupID列和orderbydate和Time列获取上一个值。在我得到上一个值后,当前记录减去上一个值作为结果。但是出了问题,结果很糟糕。有些记录获得上一个值,而有些记录没有。我不明白

有人知道如何做到这一点吗


谢谢。

您可以使用一个带有ROW_NUMBER()的公共表表达式来按时间顺序对组中的每一行进行编号。获取上一个值非常简单,只需将cte与其自身连接起来,就可以获得具有相同groupid的行和少一个行号的行。有点像

WITH cte AS (
  SELECT groupid, odate, otime, ovalue,
    ROW_NUMBER() OVER (PARTITION BY groupid ORDER BY odate, otime) rn
  FROM table1
)
SELECT a.groupid, a.odate, a.otime, a.ovalue, b.ovalue Prev_oValue,
       a.ovalue-b.ovalue oResult
FROM cte a
LEFT JOIN cte b
  ON a.groupid = b.groupid
 AND a.rn = b.rn + 1
ORDER BY a.groupid, a.odate, a.otime

.

此答案比Navneet Verma答案短,但您需要更改oResult计算。应该是a.ovalue-b。ovalue@Haminteu啊,是的,修好了,谢谢。这就是我在第一天早上喝咖啡之前编写SQL时得到的结果:)@Haminteu关于哪一个“更好”,你应该根据你的数据量进行测试,或者如果它们足够小而无关紧要,那么在你需要修改它时,使用一个更清晰的方法:)@Haminteu你得到了什么错误?似乎有效。我的意思是查看SQL。
WITH cte AS (
  SELECT groupid, odate, otime, ovalue,
    ROW_NUMBER() OVER (PARTITION BY groupid ORDER BY odate, otime) rn
  FROM table1
)
SELECT a.groupid, a.odate, a.otime, a.ovalue, b.ovalue Prev_oValue,
       a.ovalue-b.ovalue oResult
FROM cte a
LEFT JOIN cte b
  ON a.groupid = b.groupid
 AND a.rn = b.rn + 1
ORDER BY a.groupid, a.odate, a.otime