标签: unnest

PostgreSQL中的并行unfst()和排序顺序

我明白使用

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

6
推荐指数
1
解决办法
3839
查看次数

PostgreSQL多维数组

我试图将数据作为一个多维数组传递,我的行为对我来说似乎很奇怪.具体来说,我试图从二维数组中获取单个元素(因此我的二维数组中的一维数组),并且它不能按照我期望的方式工作.

在下面的例子中,#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个元素.我宁愿得到一个阵列.

我读过(其中包括):

我只是没有看到我在寻找什么.

arrays postgresql multidimensional-array unnest

6
推荐指数
1
解决办法
9266
查看次数

查找文本数组包含类似于输入值的行

我正在尝试获取类型列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条款,是否有解决方案?

arrays postgresql any sql-like unnest

6
推荐指数
3
解决办法
4464
查看次数

Postgresql - 与 string_agg 相反

我正在寻找一个 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)

sql postgresql unnest

6
推荐指数
1
解决办法
3976
查看次数

pandas:当值是可变长度的集合或列表时,从字典创建一个长/整洁的 DataFrame

简单字典:

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.

python pandas unnest

6
推荐指数
1
解决办法
477
查看次数

返回小标题:如何使用 case_when 进行矢量化?

我有一个返回小标题的函数。它运行正常,但我想对其进行矢量化。

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)

r unnest dplyr tibble

6
推荐指数
1
解决办法
734
查看次数

将多维数组转换为记录

给定:{{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)

sql arrays postgresql unnest

5
推荐指数
1
解决办法
2798
查看次数

tidyr::unnest() 具有不同的列类型

自从更新到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 创建

r unnest tidyr

5
推荐指数
1
解决办法
1543
查看次数

如何使用 dplyr 语法选择带有 bigrquery 的嵌套字段?

如果可能,我想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 的最佳方法是什么?

谢谢! …

google-analytics r unnest dbplyr bigrquery

5
推荐指数
1
解决办法
445
查看次数

使用 tidyr::unnest_wider() 时,如何根据 chr 向量命名新列

我有以下数据结构:

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)

r unnest tidyr

5
推荐指数
1
解决办法
1440
查看次数