我在 UDF 中有一个查询(如下所示),它unnest()是一个整数数组并对其进行连接,我在 pgplsql UDF 中创建了一个本地临时表,因为我知道这有效。是否可以unnest直接在查询中使用来执行连接而不必创建临时表?
CREATE OR REPLACE FUNCTION search_posts(
forum_id_ INTEGER,
query_ CHARACTER VARYING,
offset_ INTEGER DEFAULT NULL,
limit_ INTEGER DEFAULT NULL,
from_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL,
to_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL,
in_categories_ INTEGER[] DEFAULT '{}'
)
RETURNS SETOF forum_posts AS $$
DECLARE
join_string CHARACTER VARYING := ' ';
from_where_date CHARACTER VARYING := ' ';
to_where_date CHARACTER VARYING := ' ';
query_string_ CHARACTER VARYING := ' ';
offset_str_ CHARACTER VARYING …Run Code Online (Sandbox Code Playgroud) postgresql plpgsql postgresql-9.1 unnest set-returning-functions
我想在select子句中使用多个数组。显而易见的一个没有用,postgresql指向ROWS FROM()...
select * from unnest(array[1,2], array[3,4]) as (a int, b int);
Run Code Online (Sandbox Code Playgroud)
错误:
UNNEST() with multiple arguments cannot have a column definition list
LINE 1: select * from unnest(array[1,2], array[3,4]) as (a int, b in...
^
HINT: Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one.
Run Code Online (Sandbox Code Playgroud)
...
select * from rows from (unnest(array[1,2]), unnest(array[3,4])) as (a int, b int);
Run Code Online (Sandbox Code Playgroud)
错误:
ROWS FROM() with multiple functions cannot have a column definition list …Run Code Online (Sandbox Code Playgroud) Google Analytics(分析)BigQuery表的结构如下(旧版SQL表示法 - 仅显示相关字段):
visitId: INTEGER
hits: RECORD/REPEATED
hits.hour: INTEGER
Run Code Online (Sandbox Code Playgroud)
在一个这样的表上,以下查询运行良好:
SELECT
visitId,
MIN(h.hour) AS firstHitHour
FROM
`my-table.ga_sessions_20161122`, UNNEST(hits) AS h
GROUP BY
visitId
Run Code Online (Sandbox Code Playgroud)
但是使用这种替代语法:
SELECT
visitId,
(SELECT MIN(hour) FROM UNNEST(hits)) as firstHitHour
FROM
`my-table.ga_sessions_20161122`
GROUP BY
visitId
Run Code Online (Sandbox Code Playgroud)
触发以下错误:
错误:UNNEST表达式引用既未分组也未聚合的列命中
我知道UNNEST(hits)必须以某种方式分组或聚合,但由于这个专栏是一个array (repeated),它究竟意味着什么?
如果我hits按照要求尝试"对列进行分组",如下所示:
(SELECT MIN(hour) FROM UNNEST(hits) as h GROUP BY h) as firstHitHour
Run Code Online (Sandbox Code Playgroud)
然后我收到一个Grouping by expressions of type STRUCT is not allowed错误.
如何纠正这种替代语法以产生与第一种语法相同的结果?
Presto 具有UNNEST分解由数组组成的列的功能。Hive 有类似的吗?在此处查看UNNESTPresto 功能的文档。
我正在尝试使用 Google Bigquery 中另一个表中的最小和最大日期创建日期视图。我遇到过 GENERATE_DATE_ARRAY 并能够在单个数组中创建我想要的日期。然而,将它们拆分为每行一个日期一直是困难的部分。
我尝试使用 UNNEST 来执行此操作,但是当我运行代码时,它只给出第一个结果,因此我在这里遗漏了一些内容。
这是我用来生成数组的代码,但我坚持将其拆分:
SELECT GENERATE_DATE_ARRAY(
MIN(CAST(journaldate AS DATE)),
MAX(CAST(journaldate AS DATE))
)
AS Period
FROM
dataset.table
Run Code Online (Sandbox Code Playgroud) 我正在从 R 包中封装的 API 中提取一些道路交通数据。我正在使用列表数据框来控制多组记录的下载。
# install.packages(webTRISr)
library(webTRISr)
library(tidyverse)
sites <- c(5745, 6345)
start_date = '01112017'
end_date = '31122017'
road_reports <- data_frame(sites, start_date, end_date) %>%
mutate(data = purrr::pmap(list(sites, start_date, end_date), webTRISr::webtris_report, report_type = "daily"))
Run Code Online (Sandbox Code Playgroud)
当我看到unnest结果时...
road_reports %>%
unnest(data)
# Error: No common type for `..1$data$Site Name` <character> and `..2$data$Site Name` <double>.
Run Code Online (Sandbox Code Playgroud)
这是因为“站点名称”列在 API 的一次调用中是一个字符,但在另一次调用中是一个双精度字符。
从这个tidyr已关闭的问题(https://github.com/tidyverse/tidyr/issues/658)开始,我认为这已被视为一个错误并已在tidyrv1.0.0 中进行排序。
有解决办法吗?这个 SO 答案的解决方案给出了相同的错误。
我尝试传递一个ptype参数来unnest()强制数据类型,但出现有损转换错误,即:
ptype <- data_frame('Site Name'= character(),
'Report …Run Code Online (Sandbox Code Playgroud) Postgres 11.7。
我正在尝试解压一个数组,其中每个项目都有多个元素,并且似乎无法获得正确的语法。我希望有人能指出我所缺少的东西。这是一个例子:
select
unnest(array[
('Red Large Special', 1),
('Blue Small', 5),
('Green Medium Special', 87)
]) as item_list
Run Code Online (Sandbox Code Playgroud)
这就是我要的:
item_name item_id
Red Large Special 1
Blue Small 5
Green Medium Special 87
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
base_strings
("Red Large Special",1)
("Blue Small",5)
("Green Medium Special",87)
Run Code Online (Sandbox Code Playgroud)
我相信我需要一个列规格列表,如下所示:
select * from
unnest(array[
('Red Large Special', 1),
('Blue Small', 5),
('Green Medium Special', 87)
]) AS item_list(item_name citext, item_id int4)
Run Code Online (Sandbox Code Playgroud)
我得到的是:
ERROR: function return row and query-specified return row do not match
DETAIL: Returned type …Run Code Online (Sandbox Code Playgroud) 以下是我在数据库中的两个表mavenmovies。
测试位置(表 1)
CREATE TABLE mavenmovies.testLocation (
id INT AUTO_INCREMENT PRIMARY KEY,
State varchar(255),
name varchar(255)
);
INSERT INTO testLocation (State, name)
VALUES
('Alabama','Birmingham;Huntsville;Mobile;Montgomery'),
('Florida','Tampa;Jacksonville;Destin');
Run Code Online (Sandbox Code Playgroud)
数字(表 2)
CREATE TABLE mavenmovies.numbers (
n INT PRIMARY KEY);
INSERT INTO numbers VALUES (1),(2);
Run Code Online (Sandbox Code Playgroud)
这是我要查询的
这是我目前查询的内容(请参阅下面的当前查询/尝试)
我当前的查询/尝试
select
testLocation.id,
SUBSTRING_INDEX(SUBSTRING_INDEX(testLocation.name, ';', numbers.n), ';', -1) name
from
numbers, testLocation;
Run Code Online (Sandbox Code Playgroud)
我的问题
如何扩展我的查询以处理每行未知数量的分隔值?例如,一行可能有四个、二十个或零个分隔值。
感谢大家提供的任何指导。
我有不同大小的数组,我希望数组中的每个值位于单独的行中。为此,我使用了交叉连接取消嵌套。但是它正在工作,它正在删除空数组。
因此,当我这样做时,我的列 ID 包含不同的数组,其中一些为空
select *
from table
cross join unnest (t.id) as t(order_id)
where length(order_id) = 5 or order_id is NULL
Run Code Online (Sandbox Code Playgroud)
我只得到以下结果
| ID | 订单号 |
|---|---|
| 23deo jfr32 6582w | 23deo |
| 23deo jfr32 6582w | 杰夫32 |
| 23deo jfr32 6582w | 6582瓦 |
而且我要
| ID | 订单号 |
|---|---|
| 23deo jfr32 6582w | 23deo |
| 23deo jfr32 6582w | 杰夫32 |
| 23deo jfr32 6582w | 6582瓦 |
| 无效的 | 无效的 |
如果有人知道如何取消嵌套空值,我们将不胜感激。我一直在互联网上查找,我发现我们可以包含一个WITH ORDINALITY 子句,但我不知道它是如何工作的。
假设我的表中有一些数据,t。
id, arr
--, ---
1, [1,2,3]
2, [4,5,6]
Run Code Online (Sandbox Code Playgroud)
SQL
SELECT AVG(n) FROM UNNEST(
SELECT arr FROM t AS n) AS avg_arr
Run Code Online (Sandbox Code Playgroud)
这会返回错误,'Mismatched input 'SELECT'. Expecting <expression>。取消数组嵌套并聚合未嵌套值的正确方法是什么?