我明白使用
SELECT unnest(ARRAY[5,3,9]) as id
Run Code Online (Sandbox Code Playgroud)
如果没有ORDER BY子句,则不保证结果集的顺序.我可以得到:
id
--
3
5
9
Run Code Online (Sandbox Code Playgroud)
但是以下请求呢:
SELECT
unnest(ARRAY[5,3,9]) as id,
unnest(ARRAY(select generate_series(1, array_length(ARRAY[5,3,9], 1)))) as idx
ORDER BY idx ASC
Run Code Online (Sandbox Code Playgroud)
是否保证2个unnest()调用(具有相同的长度)将并行展开,并且索引idx确实匹配数组中项目的位置?
我正在使用PostgreSQL 9.3.3.
sql postgresql unnest postgresql-9.3 set-returning-functions
我试图将数据作为一个多维数组传递,我的行为对我来说似乎很奇怪.具体来说,我试图从二维数组中获取单个元素(因此我的二维数组中的一维数组),并且它不能按照我期望的方式工作.
在下面的例子中,#2,4和5以我期望的方式工作,但1和3没有.
db=> select s.col[2] from (select array[[1,2,3],[4,5,6]] as col) s;
col
-----
(1 row)
db=> select s.col[2:2] from (select array[[1,2,3],[4,5,6]] as col) s;
col
-----
{{4,5,6}}
(1 row)
db=> select array[s.col[2]] from (select array[[1,2,3],[4,5,6]] as col) s;
array
--------
{NULL}
(1 row)
db=> select array[s.col[2:2]] from (select array[[1,2,3],[4,5,6]] as col) s;
array
-------------
{{{4,5,6}}}
(1 row)
db=> select s.col[2][1] from (select array[[1,2,3],[4,5,6]] as col) s;
col
-----
4
(1 row)
Run Code Online (Sandbox Code Playgroud)
有这方面的文件吗?我现在有一些对我来说运作良好的东西,但它很难看,我担心它不会做我想做的事情.从技术上讲,我得到一个二维数组,其中1维只有1个元素.我宁愿得到一个阵列.
我读过(其中包括):
我只是没有看到我在寻找什么.
我正在尝试获取类型列text[]包含类似于某些用户输入的值的行。
到目前为止,我一直在想和做的是使用'ANY'and 'LIKE'运算符,如下所示:
select * from someTable where '%someInput%' LIKE ANY(someColum);
Run Code Online (Sandbox Code Playgroud)
但这是行不通的。该查询返回与此查询相同的值:
select * from someTable where 'someInput' = ANY(someColum);
Run Code Online (Sandbox Code Playgroud)
使用unnest()子查询中的函数我得到了很好的结果,但是WHERE如果可能,我需要查询此in 子句。
为什么LIKE操作员不与操作员一起工作,ANY并且我没有出现任何错误?我认为原因之一应该是ANY运算符在查询的右边,但是...
unnest()如果不使用WHERE条款,是否有解决方案?
我正在寻找一个 postgresql 函数,它将与string_agg.
我有一个电影表,其中标签列包含诸如
Action|Adventure|Drama|Horror|Sci-Fi
Action|Horror|Sci-Fi
Run Code Online (Sandbox Code Playgroud)
例如,我想从该列中获取不同的标签列表
Action
Adventure
Drama
Horror
Sci-Fi
Run Code Online (Sandbox Code Playgroud) 简单字典:
d = {'a': set([1,2,3]), 'b': set([3, 4])}
Run Code Online (Sandbox Code Playgroud)
(如果重要的话,这些集合可能会变成列表)
我如何将它转换成一个长/整齐DataFrame,其中每一列都是一个变量,每个观察都是一行,即:
letter value
0 a 1
1 a 2
2 a 3
3 b 3
4 b 4
Run Code Online (Sandbox Code Playgroud)
以下工作,但有点麻烦:
id = 0
tidy_d = {}
for l, vs in d.items():
for v in vs:
tidy_d[id] = {'letter': l, 'value': v}
id += 1
pd.DataFrame.from_dict(tidy_d, orient = 'index')
Run Code Online (Sandbox Code Playgroud)
有什么pandas魔法可以做到这一点吗?就像是:
pd.DataFrame([d]).T.reset_index(level=0).unnest()
Run Code Online (Sandbox Code Playgroud)
这里unnest显然不存在,来自R.
我有一个返回小标题的函数。它运行正常,但我想对其进行矢量化。
library(tidyverse)
tibTest <- tibble(argX = 1:4, argY = 7:4)
square_it <- function(xx, yy) {
if(xx >= 4){
tibble(x = NA, y = NA)
} else if(xx == 3){
tibble(x = as.integer(), y = as.integer())
} else if (xx == 2){
tibble(x = xx^2 - 1, y = yy^2 -1)
} else {
tibble(x = xx^2, y = yy^2)
}
}
Run Code Online (Sandbox Code Playgroud)
mutate当我用 调用它时map2,它运行正常,给了我想要的结果:
tibTest %>%
mutate(sq = map2(argX, argY, square_it)) %>%
unnest()
## A tibble: 3 x …Run Code Online (Sandbox Code Playgroud) 给定:{{1,"a"},{2,"b"},{3,"c"}}
期望:
foo | bar
-----+------
1 | a
2 | b
3 | c
Run Code Online (Sandbox Code Playgroud)
您可以通过以下查询获得预期结果;但是,最好有一些可以随数组大小缩放的东西。
SELECT arr[subscript][1] as foo, arr[subscript][2] as bar
FROM ( select generate_subscripts(arr,1) as subscript, arr
from (select '{{1,"a"},{2,"b"},{3,"c"}}'::text[][] as arr) input
) sub;
Run Code Online (Sandbox Code Playgroud) 自从更新到tidyr版本 1.0.0 以来,我在取消嵌套数据帧列表时开始出现错误。
出现错误的原因是列表中的某些数据帧包含具有所有 NA 值(逻辑)的列,而其他数据帧包含相同的列但具有一些字符值(字符)。具有所有 NA 值的列被编码为逻辑值,而其他列被编码为字符向量。
早期版本的默认行为tidyr处理不同的列类型没有问题(至少我在运行脚本时没有收到此错误)。
我可以从内部解决这个问题tidyr::unest()吗?
可重现的例子:
library(tidyr)
a <- tibble(
value = rnorm(3),
char_vec = c(NA, "A", NA))
b <- tibble(
value = rnorm(2),
char_vec = c(NA, "B"))
c <- tibble(
value = rnorm(3),
char_vec = c(NA, NA, NA))
tibble(
file = list(a, b, c)) %>%
unnest(cols = c(file))
#> No common type for `..1$file$char_vec` <character> and `..3$file$char_vec`
#> <logical>.
Run Code Online (Sandbox Code Playgroud)
由reprex 包(v0.3.0)于 2019-10-11 创建
如果可能,我想bigrquery使用dplyr语法(而不是 SQL)探索 Google Analytics 360 数据。要点是我想了解用户旅程——我有兴趣在用户级别(甚至跨会话)找到最常见的页面序列。
我以为我可以这样做:
sample_query <- ga_sample %>%
select(fullVisitorId, date, visitStartTime, totals, channelGrouping,
hits.page.pagePath) %>%
collect()
Run Code Online (Sandbox Code Playgroud)
但我收到一个hits.page.pagePath未找到的错误。然后我尝试:
sample_query <- ga_sample %>%
select(fullVisitorId, date, visitStartTime, totals, channelGrouping, hits) %>%
collect() %>%
unnest_wider(hits)
Run Code Online (Sandbox Code Playgroud)
但结果是Error: Requested Resource Too Large to Return [responseTooLarge],这是完全有道理的。
从我收集到的信息来看,使用 SQL 语法,解决方法是unnest远程访问,并且select只有hits.page.pagePath字段(而不是整个hits顶级字段)。
例如,这样的事情(这是一个不同的查询,但传达了这一点):
SELECT
hits.page.pagePath
FROM
'bigquery-public-data.google_analytics_sample.ga_sessions_20160801' AS GA,
UNNEST(GA.hits) AS hits
GROUP BY
hits.page.pagePath
Run Code Online (Sandbox Code Playgroud)
是否可以用dplyr语法做类似的事情?如果不可能,那么使用 SQL 的最佳方法是什么?
谢谢! …
我有以下数据结构:
library(tibble)
my_tbl <-
tibble::tribble(
~col_x, ~col_y,
"a", list(1, 2, 3),
"b", list(4, 5, 6),
"c", list(7, 8, 9)
)
Run Code Online (Sandbox Code Playgroud)
我想用它来tidyr::unnest_wider()分隔col_y列。这些新列的名称应取自animal_names向量:
animal_names <- c("dog", "cat", "zebra")
Run Code Online (Sandbox Code Playgroud)
我如何利用unnest_wider()应用来自 的名称animal_names,从而避免以下命名警告:
library(tidyr)
my_tbl %>%
unnest_wider(col_y)
#> New names:
#> * `` -> ...1
#> * `` -> ...2
#> * `` -> ...3
#> New names:
#> * `` -> ...1
#> * `` -> ...2
#> * `` -> ...3
#> New …Run Code Online (Sandbox Code Playgroud)