PostgreSQL 如何根据查询中的条件创建布尔列
PostgreSQL How to create a boolean column from conditions within a query
我有以下 SQL 代码:
SELECT sensor_id, reader_id, rssi, date_time, time_diff_lead, reader_diff
FROM
(
SELECT doc->>'sensorId' as sensor_id, doc->>'readerId' as reader_id, (doc->>'rssi')::int as rssi, created_at as date_time,
EXTRACT(EPOCH FROM lead(created_at) OVER w - created_at) as time_diff_lead,
(lead(doc->>'readerId') OVER w)::int - (doc->>'readerId')::int as reader_diff
FROM public.sensor_data
WINDOW w AS (PARTITION BY doc->>'sensorId' ORDER BY created_at)
) as x
WHERE rssi > 380 OR time_diff_lead > 18.0 AND reader_diff = 0
ORDER BY sensor_id, date_time
WHERE 子句定义了我想用来创建布尔列的条件。
所有这些数据都来自带有 jsonB 列的 table 并且为了提高效率(我认为......)我需要通过正确的键将此列添加到 table .
table 将至少每 30 秒更新一次新记录。并且上面的查询将比 运行 少。因此该列中将有空值。一般而言,这将如何影响对 table 的查询? (数据科学新手)
我正在创业并试图为我们的数据收集奠定基础(他们让我做这件事:P)所以请拆开我的代码并指出更好的方法!
一个条件是一个布尔类型,所以你可以select你从布尔条件得到的值并给它一个别名:
SELECT sensor_id, reader_id, rssi, date_time
, time_diff_lead, reader_diff
, (rssi > 380 OR time_diff_lead > 18.0 AND reader_diff = 0) AS bull
FROM (
SELECT doc->>'sensorId' as sensor_id, doc->>'readerId' as reader_id
, (doc->>'rssi')::int as rssi, created_at as date_time
, EXTRACT(EPOCH FROM lead(created_at) OVER w - created_at) as time_diff_lead
, (lead(doc->>'readerId') OVER w)::int - (doc->>'readerId')::int as reader_diff
FROM public.sensor_data
WINDOW w AS (PARTITION BY doc->>'sensorId' ORDER BY created_at)
) as x
ORDER BY sensor_id, date_time
;
[更新]使用计算列将需要将条件拉到主查询。
我有以下 SQL 代码:
SELECT sensor_id, reader_id, rssi, date_time, time_diff_lead, reader_diff
FROM
(
SELECT doc->>'sensorId' as sensor_id, doc->>'readerId' as reader_id, (doc->>'rssi')::int as rssi, created_at as date_time,
EXTRACT(EPOCH FROM lead(created_at) OVER w - created_at) as time_diff_lead,
(lead(doc->>'readerId') OVER w)::int - (doc->>'readerId')::int as reader_diff
FROM public.sensor_data
WINDOW w AS (PARTITION BY doc->>'sensorId' ORDER BY created_at)
) as x
WHERE rssi > 380 OR time_diff_lead > 18.0 AND reader_diff = 0
ORDER BY sensor_id, date_time
WHERE 子句定义了我想用来创建布尔列的条件。
所有这些数据都来自带有 jsonB 列的 table 并且为了提高效率(我认为......)我需要通过正确的键将此列添加到 table .
table 将至少每 30 秒更新一次新记录。并且上面的查询将比 运行 少。因此该列中将有空值。一般而言,这将如何影响对 table 的查询? (数据科学新手)
我正在创业并试图为我们的数据收集奠定基础(他们让我做这件事:P)所以请拆开我的代码并指出更好的方法!
一个条件是一个布尔类型,所以你可以select你从布尔条件得到的值并给它一个别名:
SELECT sensor_id, reader_id, rssi, date_time
, time_diff_lead, reader_diff
, (rssi > 380 OR time_diff_lead > 18.0 AND reader_diff = 0) AS bull
FROM (
SELECT doc->>'sensorId' as sensor_id, doc->>'readerId' as reader_id
, (doc->>'rssi')::int as rssi, created_at as date_time
, EXTRACT(EPOCH FROM lead(created_at) OVER w - created_at) as time_diff_lead
, (lead(doc->>'readerId') OVER w)::int - (doc->>'readerId')::int as reader_diff
FROM public.sensor_data
WINDOW w AS (PARTITION BY doc->>'sensorId' ORDER BY created_at)
) as x
ORDER BY sensor_id, date_time
;
[更新]使用计算列将需要将条件拉到主查询。