如果列具有不同数量的行(通过匹配名称),如何从列值中减去列值
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;
我有一个这样的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;