select count(1) from (SELECT record_id, mid, UNNEST ( string_to_array( ext_7, ',' ) ) AS ext_7 FROM d_form_list_context_patrol_toadb_0419 WHERE check_result = 'check_no' 如何替换为hive sql
时间: 2024-03-28 12:41:43 浏览: 93
你的问题中给出的 SQL 语句是 PostgreSQL 的语法,如果要在 Hive 中实现同样的功能,可以使用以下 SQL 语句:
```
SELECT count(1) FROM
(SELECT record_id, mid, explode(split(ext_7, ',')) AS ext_7
FROM d_form_list_context_patrol_toadb_0419
WHERE check_result = 'check_no') t;
```
其中,`split` 函数用于将 ext_7 字段按逗号分隔成数组,`explode` 函数用于将数组的每个元素拆分成单独的行,然后就可以统计行数了。
相关问题
SELECT record_id, mid, UNNEST ( string_to_array( ext_7, ',' ) ) AS ext_7 FROM d_form_list_context_patrol_toadb_0419 替换为hivesql
使用Lateral View和Explode函数替换UNNEST和string_to_array函数,同时选择需要的字段,Hive SQL语句如下:
SELECT record_id, mid, exploded_ext_7 AS ext_7
FROM d_form_list_context_patrol_toadb_0419
LATERAL VIEW explode(split(ext_7,',')) exploded_ext_7;
帮我优化这个pgsql select info.pot_type_name,info.ttpw_addr as twlPortName,info.ttpw_addr_code as twlPortCode,info.tmr_material_name,info.ids --库存 ,(select sum(twl_leave_stock) from tms_whe_control where twl_material_id = any(STRING_TO_ARRAY(ids, ','))and twl_port_code=ttpw_addr_code and pot_type_name='合作港口') as twl_leave_stock from ( select port.pot_type_name,ttpw.ttpw_addr ,ttpw.ttpw_addr_code,tmrGroup.tmr_material_name, array_to_string( ARRAY( SELECT unnest(string_to_array(array_to_string(array_agg(distinct(tmr.tmr_id)),','), ',')) ), ',' ) ids from tms_transport_plan_work ttpw,tms_material_ref tmr,tms_material_ref tmrGroup,pub_ports port,tms_transport_plan plan where tmr.tmr_id=ttpw_tmr_id and tmr.parent_tmr_id=tmrGroup.tmr_id and port.pot_regcd=ttpw.ttpw_addr_code and port.pot_cnname=ttpw.ttpw_addr and plan.ttp_id=ttpw.ttpw_ttp_id and plan.ttp_waybill_status >0 AND ttpw.ttpw_plan_amount > 0 GROUP BY pot_type_name,ttpw_addr,ttpw_addr_code,tmrGroup.tmr_material_name ORDER BY ttpw_addr ) as info
这个 SQL 语句有一些可优化的地方,可以考虑以下几点:
1. 尽可能使用 JOIN 代替子查询。例如,第一个子查询中的 `pub_ports` 表可以通过 JOIN 进行连接。
2. 避免使用 `array_agg` 和 `unnest` 函数。这些函数需要进行大量的数组转换操作,非常耗费资源。如果可以,可以考虑使用其他方式将数组数据按逗号拼接。
3. 在使用 GROUP BY 时,只选择必要的列。不需要 GROUP BY 的列可以在外部查询中进行选择。
4. 对于多个表的连接,可以考虑使用合适的索引来提高查询性能。
下面是优化后的 SQL 语句:
```
SELECT
pot.pot_type_name,
ttpw.ttpw_addr AS twlPortName,
ttpw.ttpw_addr_code AS twlPortCode,
tmrGroup.tmr_material_name,
array_to_string(ids, ',') AS ids,
tms_whe.twl_leave_stock
FROM (
SELECT
ttpw_tmr_id,
array_agg(DISTINCT tmr.tmr_id) AS ids,
ttpw_addr,
ttpw_addr_code,
pot_type_name,
tmrGroup.tmr_material_name
FROM tms_transport_plan_work ttpw
JOIN tms_material_ref tmr ON tmr.tmr_id = ttpw.ttpw_tmr_id
JOIN tms_material_ref tmrGroup ON tmrGroup.tmr_id = tmr.parent_tmr_id
JOIN pub_ports pot ON pot.pot_regcd = ttpw.ttpw_addr_code AND pot.pot_cnname = ttpw.ttpw_addr
WHERE ttpw_plan_amount > 0
GROUP BY ttpw_tmr_id, ttpw_addr, ttpw_addr_code, pot_type_name, tmrGroup.tmr_material_name
) AS info
LEFT JOIN (
SELECT twl_material_id, twl_port_code, SUM(twl_leave_stock) AS twl_leave_stock
FROM tms_whe_control
WHERE pot_type_name = '合作港口'
GROUP BY twl_material_id, twl_port_code
) AS tms_whe ON tms_whe.twl_material_id = ANY(ids) AND tms_whe.twl_port_code = twlPortCode
ORDER BY twlPortName
```
这个 SQL 语句使用了 JOIN 来代替子查询,并避免了使用 `array_agg` 和 `unnest` 函数。同时,只选择必要的列进行 GROUP BY,使用合适的索引来优化查询性能。
阅读全文