"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 不会重叠。如果你想处理这些,请提供额外的边缘案例,比如那个和评论中提到的那些,并解释你希望如何处理它们。