running_difference
description
Syntax
T running_difference(T x) 计算数据块中连续行值的差值。该函数的结果取决于受影响的数据块和块中数据的顺序。
计算 running_difference 期间使用的行顺序可能与返回给用户的行顺序不同。所以结果是不稳定的。此函数会在后续版本中废弃。 推荐使用窗口函数完成预期功能。举例如下:
1. -- running difference(x)
2. SELECT running_difference(x) FROM t ORDER BY k;
4. -- 窗口函数
5. SELECT x - lag(x, 1, 0) OVER (ORDER BY k) FROM t;
Arguments
x - 一列数据.数据类型可以是TINYINT,SMALLINT,INT,BIGINT,LARGEINT,FLOAT,DOUBLE,DATE,DATETIME,DECIMAL
Returned value
第一行返回 0,随后的每一行返回与前一行的差值。
example
1. DROP TABLE IF EXISTS running_difference_test;
3. CREATE TABLE running_difference_test (
4. `id` int NOT NULL COMMENT 'id',
5. `day` date COMMENT 'day',
6. `time_val` datetime COMMENT 'time_val',
7. `doublenum` double NULL COMMENT 'doublenum'
8. )
9. DUPLICATE KEY(id)
10. DISTRIBUTED BY HASH(id) BUCKETS 3
11. PROPERTIES (
12. "replication_num" = "1"
13. );
15. INSERT into running_difference_test (id, day, time_val,doublenum) values ('1', '2022-10-28', '2022-03-12 10:41:00', null),
16. ('2','2022-10-27', '2022-03-12 10:41:02', 2.6),
17. ('3','2022-10-28', '2022-03-12 10:41:03', 2.5),
18. ('4','2022-9-29', '2022-03-12 10:41:03', null),
19. ('5','2022-10-31', '2022-03-12 10:42:01', 3.3),
20. ('6', '2022-11-08', '2022-03-12 11:05:04', 4.7);
22. SELECT * from running_difference_test ORDER BY id ASC;
24. +------+------------+---------------------+-----------+
25. | id | day | time_val | doublenum |
26. +------+------------+---------------------+-----------+
27. | 1 | 2022-10-28 | 2022-03-12 10:41:00 | NULL |
28. | 2 | 2022-10-27 | 2022-03-12 10:41:02 | 2.6 |
29. | 3 | 2022-10-28 | 2022-03-12 10:41:03 | 2.5 |
30. | 4 | 2022-09-29 | 2022-03-12 10:41:03 | NULL |
31. | 5 | 2022-10-31 | 2022-03-12 10:42:01 | 3.3 |
32. | 6 | 2022-11-08 | 2022-03-12 11:05:04 | 4.7 |
33. +------+------------+---------------------+-----------+
35. SELECT
36. id,
37. running_difference(id) AS delta
38. FROM
39. (
40. SELECT
41. id,
42. day,
43. time_val,
44. doublenum
45. FROM running_difference_test
46. )as runningDifference ORDER BY id ASC;
48. +------+-------+
49. | id | delta |
50. +------+-------+
51. | 1 | 0 |
52. | 2 | 1 |
53. | 3 | 1 |
54. | 4 | 1 |
55. | 5 | 1 |
56. | 6 | 1 |
57. +------+-------+
59. SELECT
60. day,
61. running_difference(day) AS delta
62. FROM
63. (
64. SELECT
65. id,
66. day,
67. time_val,
68. doublenum
69. FROM running_difference_test
70. )as runningDifference ORDER BY id ASC;
72. +------------+-------+
73. | day | delta |
74. +------------+-------+
75. | 2022-10-28 | 0 |
76. | 2022-10-27 | -1 |
77. | 2022-10-28 | 1 |
78. | 2022-09-29 | -29 |
79. | 2022-10-31 | 32 |
80. | 2022-11-08 | 8 |
81. +------------+-------+
83. SELECT
84. time_val,
85. running_difference(time_val) AS delta
86. FROM
87. (
88. SELECT
89. id,
90. day,
91. time_val,
92. doublenum
93. FROM running_difference_test
94. )as runningDifference ORDER BY id ASC;
96. +---------------------+-------+
97. | time_val | delta |
98. +---------------------+-------+
99. | 2022-03-12 10:41:00 | 0 |
100. | 2022-03-12 10:41:02 | 2 |
101. | 2022-03-12 10:41:03 | 1 |
102. | 2022-03-12 10:41:03 | 0 |
103. | 2022-03-12 10:42:01 | 58 |
104. | 2022-03-12 11:05:04 | 1383 |
105. +---------------------+-------+
107. SELECT
108. doublenum,
109. running_difference(doublenum) AS delta
110. FROM
111. (
112. SELECT
113. id,
114. day,
115. time_val,
116. doublenum
117. FROM running_difference_test
118. )as runningDifference ORDER BY id ASC;
120. +-----------+----------------------+
121. | doublenum | delta |
122. +-----------+----------------------+
123. | NULL | NULL |
124. | 2.6 | NULL |
125. | 2.5 | -0.10000000000000009 |
126. | NULL | NULL |
127. | 3.3 | NULL |
128. | 4.7 | 1.4000000000000004 |
129. +-----------+----------------------+
keywords
running_difference
