如果列具有不同数量的行(通过匹配名称),如何从列值中减去列值

How to subtract column's values from column's values if columns have different quantity of rows (by matching names)

我有一个这样的table,数据库是ClickHouse:

SELECT name, value, timing 
FROM table1 tl1
WHERE
    timing >= '2022-05-23 01:00:00' AND timing <= '2022-05-23 02:00:00'
ORDER BY name, timing 

┌─name─┬─value─┬──────────────timing─┐
│ A    │     5 │ 2022-05-23 01:01:03 │
│ A    │     5 │ 2022-05-23 01:01:05 │
│ A    │     5 │ 2022-05-23 01:01:06 │
│ A    │     5 │ 2022-05-23 01:01:07 │
│ A    │     9 │ 2022-05-23 01:02:01 │
│ A    │     7 │ 2022-05-23 01:03:21 │
│ B    │     5 │ 2022-05-23 01:04:23 │
│ B    │     6 │ 2022-05-23 01:05:33 │
│ C    │     7 │ 2022-05-23 01:06:30 │
│ C    │     8 │ 2022-05-23 01:07:41 │
│ C    │     3 │ 2022-05-23 01:08:44 │
│ C    │     7 │ 2022-05-23 01:09:50 │
└──────┴───────┴─────────────────────┘

从每个“A”、“B”、“C”值(第一个查询)中,我需要从相同的 table 中减去匹配最小值(时间)的值。

在接下来的查询中,我为每个唯一名称选择了满足条件 min(timing) 的值。

SELECT
    tpl.1 AS name,
    tpl.6 AS value,
    tpl.3 AS timing
FROM
(
    SELECT argMin(tuple(*), timing) AS tpl
    FROM table1 tl 
    WHERE timing >= '2022-05-23 01:00:00' AND timing <= '2022-05-23 02:00:00'
    GROUP BY name
)
ORDER BY name ASC, timing


┌─name─┬─value─┬──────────────timing─┐
│ A    │     5 │ 2022-05-23 01:01:03 │
│ B    │     5 │ 2022-05-23 01:04:23 │
│ C    │     7 │ 2022-05-23 01:06:30 │
└──────┴───────┴─────────────────────┘

我需要通过匹配名称从原始 table 中减去第二个查询的结果值。这是我无法解决的问题。我的目标是获得下一个 table,从第一个查询的每个值“A”、“B”、“C”中减去一个“A”、“B”、“C”值(最低时间)来自第二个查询。

因此我需要这样的 table:

┌─name─┬─value─┬──────────────timing─┐
│ A    │     0 │ 2022-05-23 01:01:03 │
│ A    │     0 │ 2022-05-23 01:01:05 │
│ A    │     0 │ 2022-05-23 01:01:06 │
│ A    │     0 │ 2022-05-23 01:01:07 │
│ A    │     4 │ 2022-05-23 01:02:01 │
│ A    │     3 │ 2022-05-23 01:03:21 │
│ B    │     0 │ 2022-05-23 01:04:23 │
│ B    │     1 │ 2022-05-23 01:05:33 │
│ C    │     0 │ 2022-05-23 01:06:30 │
│ C    │     1 │ 2022-05-23 01:07:41 │
│ C    │    -4 │ 2022-05-23 01:08:44 │
│ C    │     0 │ 2022-05-23 01:09:50 │
└──────┴───────┴─────────────────────┘

我只需要合并我的查询,但我不知道该怎么做。

另外,第二个查询可以修改为:

SELECT name, value  
FROM table1 tbl1
INNER JOIN
(
    SELECT name, MIN(timing) AS min_timing
    FROM table1 tl
    WHERE timing >= '2022-05-23 01:00:00' AND timing <= '2022-05-23 02:00:00'
    GROUP BY name
) tbl2
    ON tbl2.name = tbl1.name AND
       tbl2.min_timing = tbl1.timing
WHERE
    timing >= '2022-05-23 01:00:00' AND timing <= '2022-05-23 02:00:00' 
ORDER BY name, timing

使用window函数FIRST_VALUE获取每个名称的最小值:

SELECT
  name,
  value - FIRST_VALUE(value) OVER (PARTITION BY name ORDER BY timing) as diff,
  timing
FROM table1
WHERE timing >= timestamp '2022-05-23 01:00:00'
  AND timing <  timestamp '2022-05-23 02:00:00'
ORDER BY name, timing;