对于我的问题,我使用json_aggin join 来聚合我的结果。但这会导致嵌套数组序列。
询问:
SELECT c.*,
json_agg(ci.national_id) AS national_id,
json_agg(a.address) AS address
FROM company AS c
LEFT JOIN
(SELECT company_id,
json_agg(json_build_object('value', national_id, 'country', country_code)) AS national_id
FROM company_identification
GROUP BY company_id) AS ci ON ci.company_id = c.id
LEFT JOIN
(SELECT company_id,
json_agg(address.*) AS address
FROM address
GROUP BY company_id) AS a ON a.company_id = c.id
GROUP BY c.id
Run Code Online (Sandbox Code Playgroud)
结果:
[
{
"id": "c876967d-dd8b-4068-88f4-57a438a2015c",
"name": "S.A.1",
"nationalId": [
[
{
"value": "string",
"country": "CL"
}
]
],
"address": [ …Run Code Online (Sandbox Code Playgroud) 给定一个像这样的表结构:
id | name | amount | other1 | other2 | other3
Run Code Online (Sandbox Code Playgroud)
和示例数据,例如:
1 | a | 40 | unrelevant data | ...
2 | a | 80 | unrelevant data | ...
3 | b | 30 | unrelevant data | ...
4 | b | 50 | unrelevant data | ...
5 | c | 20 | unrelevant data | ...
6 | c | 30 | unrelevant data | ...
Run Code Online (Sandbox Code Playgroud)
我希望我的选择结果压缩行并对压缩的金额进行求和,就像这样,我不关心丢失的数据(表示不相关数据的行):
1 | a | 120 | …Run Code Online (Sandbox Code Playgroud) 我正在研究一个业务案例,其中人们在不同时间访问不同地点。
我需要将每个系列分组在同一位置并将其作为一行返回。
为了说明这一点,我创建并填充了表访问(见下文)。
select loc, hour from visit order by hour给我
Loc Hour
1 10
1 11
1 12
2 13
2 14
1 15
1 16
Run Code Online (Sandbox Code Playgroud)
我想要一个返回以下内容的 SQL:
Loc first last
1 10 12
2 13 14
1 15 16
Run Code Online (Sandbox Code Playgroud)
有建议吗?
示例中的表格/数据
create table visit ( loc number(2), hour number(2) );
insert into visit (loc, hour) values (1,10);
insert into visit (loc, hour) values (1,11);
insert into visit (loc, hour) values (1,12);
insert into visit (loc, …Run Code Online (Sandbox Code Playgroud) sql database aggregate-functions window-functions gaps-and-islands
我有一个火花df
spark_df = spark.createDataFrame(
[(1, 7, 'foo'),
(2, 6, 'bar'),
(3, 4, 'foo'),
(4, 8, 'bar'),
(5, 1, 'bar')
],
['v1', 'v2', 'id']
)
Run Code Online (Sandbox Code Playgroud)
预期输出
id avg(v1) avg(v2) min(v1) min(v2) 0.25(v1) 0.25(v2) 0.5(v1) 0.5(v2)
0 bar 3.666667 5.0 2 1 some-value some-value some-value some-value
1 foo 2.000000 5.5 1 4. some-value some-value some-value some-value
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经可以实现平均值、最小值、最大值等基本统计数据。但无法获得分位数。我知道,这可以在 Pandas 中轻松实现,但无法在 Pyspark 中完成
另外,我知道 approxQuantile,但我无法将基本统计数据与 pyspark 中的分位数结合起来
到目前为止,我可以使用 agg 获得平均值和最小值等基本统计数据。我也想要相同 df 中的分位数
func = [F.mean, F.min,]
NUMERICAL_FEATURE_LIST = ['v1', 'v2']
GROUP_BY_FIELDS = ['id']
exp …Run Code Online (Sandbox Code Playgroud) 我有一个包含部分连续整数 id 的表,即有诸如1,2,3, 6,7,8, 10, 23,24,25,26.
我对一个简单的解决方案感到非常困惑,该解决方案从表中进行选择,并包含一个列,其中的值对应于相应块的第一个 id。
即像这样的东西
select id, first(id) over <what goes here?> first from table;
Run Code Online (Sandbox Code Playgroud)
结果应如下所示
| id | first |
|----|-------|
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 6 | 6 |
| 7 | 6 |
| 8 | 6 |
| 10 | 10 |
| 23 | 23 |
| 24 | 23 |
| 25 | 23 …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个 jsonb 对象,其键按字母顺序排列。然而,它似乎jsonb_object_agg(k, v)忽略了输入的顺序,并按密钥长度对输入进行排序,然后按字母顺序排序。
例如
select jsonb_object_agg(k, v order by k) from (
values ('b', 'b_something'), ('ab', 'ab_something')
) as t (k,v)
Run Code Online (Sandbox Code Playgroud)
给出
{
"b": "b_something",
"ab": "ab_something"
}
Run Code Online (Sandbox Code Playgroud)
但我需要的是
{
"ab": "ab_something"
"b": "b_something",
}
Run Code Online (Sandbox Code Playgroud)
有办法实现这一点吗?
上下文 我正在展平一个 json 列,其中的内容遵循统一但笨重的模式。由于这个有用的答案,我已经成功地做到了这一点,但是按键的顺序并不是我需要它们的方式。
我正在研究 Python Pandas。
我有一个 pandas 数据框,其中包含如下列:
| ID | 城市 |
|---|---|
| 1 | 纽约 |
| 1 | ” |
| 1 | 亚特兰大 |
| 2 | 东京 |
| 2 | 京都 |
| 2 | ” |
| 3 | 巴黎 |
| 3 | 波尔多 |
| 3 | ” |
| 4 | 孟买 |
| 4 | ” |
| 4 | 班加罗尔 |
| 5 | 伦敦 |
| 5 | ” |
| 5 | 伯明翰 |
请注意,列中的空单元格要么是空字符串 (''),要么是 Nan 或 None。(为简单起见,我们只说它们是空字符串(''))。
我希望结果是这样的:
| ID | 城市 |
|---|---|
| 1 | 纽约、亚特兰大 |
| 2 | 东京、京都 |
| 3 | 巴黎、波尔多 |
| 4 | 孟买、班加罗尔 |
| 5 | 伦敦、伯明翰 |
简而言之,我想按 ID 分组,然后获取列表(通过删除空字符串)。
我有一个示例代码,但它实际上给了我带有空字符串的结果,我想删除空字符串。
dataFrame.groupby(['ID'], as_index=False)
.agg({'Cities': lambda x: x.tolist()})
Run Code Online (Sandbox Code Playgroud)
它给了我这样的结果:
| ID | 城市 |
|---|---|
| 1 | 纽约、亚特兰大 |
| 2 | 东京、京都、 |
| 3 | 巴黎、波尔多、 |
| 4 | 孟买、班加罗尔 |
| 5 | 伦敦、伯明翰 |
但我不想要空字符串...... …
我有一个 PySpark 数据框,想要对几列进行分组,然后计算一些列的总和并计算另一列的不同值。由于countDistinct不是内置聚合函数,我无法使用像我在这里尝试的那样的简单表达式:
sum_cols = ['a', 'b']
count_cols = ['id']
exprs1 = {x: "sum" for x in sum_cols}
exprs2 = {x: "countDistinct" for x in count_cols}
exprs = {**exprs1, **exprs2}
df_aggregated = df.groupby('month','product').agg(exprs)
Run Code Online (Sandbox Code Playgroud)
我也尝试了这个答案中的方法,但是当我仅针对聚合列尝试时,exprs2 = [countDistinct(x) for x in count_cols]我收到了一条错误消息 。AssertionError: all exprs should be Column
如何将总和和不同计数合并到一个聚合中?我知道,我可以对sum列执行一次,然后对列执行一次countDistinct,然后加入两个数据框,但应该有一种解决方案可以一步完成此操作......
我想分别得到A组和B组的总和,然后将每组除以总和。
我尝试使用这个:
select name, sum(qt)
from ntbl
group by name
Run Code Online (Sandbox Code Playgroud)
| 订单号 | 姓名 | qt |
|---|---|---|
| 1 | A | 12 |
| 2 | A | 20 |
| 3 | 乙 | 33 |
| 4 | 乙 | 45 |
结果应该是:
| 姓名 | qt | DV |
|---|---|---|
| A | 32 | 0.29 |
| 乙 | 78 | 0.70 |
给定一个特定类型的表
| A | 乙 | C |
|---|---|---|
| t | r | 1 |
| t | r | 1 |
| n | j | 2 |
| n | j | 2 |
| n | j | 2 |
我想对Aand进行分组B,并且仅采用由指定的行数C
所以期望的输出是
| A | 乙 | C |
|---|---|---|
| t | r | 1 |
| n | j | 2 |
| n | j | 2 |
我试图通过这个功能来实现这一点,但没有运气
df.groupby(['A', 'B']).agg(lambda x: x.head(df.C))
Run Code Online (Sandbox Code Playgroud)