"pivot" table 来自 datediff
"pivot" table by datediff
我在 SQL table
中有以下数据
date
data_id
data_value
2022-05-02 11:17:10.9033333
camTray_x
4.989
2022-05-02 11:17:10.9033333
camTray_y
1.308
2022-05-02 11:17:14.0966667
camTray_x
1.469
2022-05-02 11:17:14.1066667
camTray_y
2.845
我想根据2条记录的时间差(可以是0,小于100ms)得到如下结果
date
X
Y
2022-05-02 11:17:10.9033333
4.989
1.308
2022-05-02 11:17:14.0966667
1.469
2.845
我不是 SQL 专家并试图模仿几个类似的方法,我有一个像下面这样的有效解决方案
with xvalues as (select date, data_value as 'X' from _prod_data_line where data_id='camTray_x' ),
yvalues as (select date, data_value as 'Y' from _prod_data_line where data_id='camTray_Y' )
select xvalues.date, xvalues.X, yvalues.Y from xvalues left join yvalues on
abs(datediff(millisecond, xvalues.date, yvalues.date))<100
没有 2 个选择是否可行?
这将通过一次扫描而不是两次扫描来处理操作,但它更复杂,因此(通常是这种情况)您可以用复杂性换取性能。
; -- see sqlblog.org/cte
WITH cte AS
(
SELECT date,
X = data_value,
Y = LEAD(CASE WHEN data_id = 'camTray_y' THEN data_value END,1)
OVER (ORDER BY date),
delta = DATEDIFF(MILLISECOND, date,
LEAD(CASE WHEN data_id = 'camTray_y' THEN date END,1)
OVER (ORDER BY date))
FROM dbo._prod_data_line
)
SELECT date, X, Y FROM cte WHERE delta <= 100;
输出:
date
X
Y
2022-05-02 11:17:10.9033333
4.989
1.308
2022-05-02 11:17:14.0966667
1.469
2.845
此外,这是一种简化,因为它假设 x/y 不会重叠。如果你想处理这些,请提供额外的边缘案例,比如那个和评论中提到的那些,并解释你希望如何处理它们。
我在 SQL table
中有以下数据date | data_id | data_value |
---|---|---|
2022-05-02 11:17:10.9033333 | camTray_x | 4.989 |
2022-05-02 11:17:10.9033333 | camTray_y | 1.308 |
2022-05-02 11:17:14.0966667 | camTray_x | 1.469 |
2022-05-02 11:17:14.1066667 | camTray_y | 2.845 |
我想根据2条记录的时间差(可以是0,小于100ms)得到如下结果
date | X | Y |
---|---|---|
2022-05-02 11:17:10.9033333 | 4.989 | 1.308 |
2022-05-02 11:17:14.0966667 | 1.469 | 2.845 |
我不是 SQL 专家并试图模仿几个类似的方法,我有一个像下面这样的有效解决方案
with xvalues as (select date, data_value as 'X' from _prod_data_line where data_id='camTray_x' ),
yvalues as (select date, data_value as 'Y' from _prod_data_line where data_id='camTray_Y' )
select xvalues.date, xvalues.X, yvalues.Y from xvalues left join yvalues on
abs(datediff(millisecond, xvalues.date, yvalues.date))<100
没有 2 个选择是否可行?
这将通过一次扫描而不是两次扫描来处理操作,但它更复杂,因此(通常是这种情况)您可以用复杂性换取性能。
; -- see sqlblog.org/cte
WITH cte AS
(
SELECT date,
X = data_value,
Y = LEAD(CASE WHEN data_id = 'camTray_y' THEN data_value END,1)
OVER (ORDER BY date),
delta = DATEDIFF(MILLISECOND, date,
LEAD(CASE WHEN data_id = 'camTray_y' THEN date END,1)
OVER (ORDER BY date))
FROM dbo._prod_data_line
)
SELECT date, X, Y FROM cte WHERE delta <= 100;
输出:
date | X | Y |
---|---|---|
2022-05-02 11:17:10.9033333 | 4.989 | 1.308 |
2022-05-02 11:17:14.0966667 | 1.469 | 2.845 |
此外,这是一种简化,因为它假设 x/y 不会重叠。如果你想处理这些,请提供额外的边缘案例,比如那个和评论中提到的那些,并解释你希望如何处理它们。