我正在寻找一种通过查询连接组内字段的字符串的方法.例如,我有一张桌子:
ID COMPANY_ID EMPLOYEE
1 1 Anna
2 1 Bill
3 2 Carol
4 2 Dave
Run Code Online (Sandbox Code Playgroud)
我想通过company_id分组得到类似的东西:
COMPANY_ID EMPLOYEE
1 Anna, Bill
2 Carol, Dave
Run Code Online (Sandbox Code Playgroud)
mySQL中有一个内置函数来执行这个group_concat
我见过很多关于数据透视表的问题.即使他们不知道他们询问数据透视表,他们通常也是.几乎不可能写出一个规范的问题和答案,其中包含了旋转的所有方面....
......但是我要试一试.
现有问题和答案的问题在于,问题通常集中在OP难以概括以便使用一些现有的良好答案的细微差别.但是,没有一个答案试图给出全面的解释(因为这是一项艰巨的任务)
从我的谷歌搜索中查看一些示例
pd.DataFrame.pivot因此,每当有人搜索时,pivot他们会得到零星的结果,而这些结果可能无法回答他们的具体问题.
您可能会注意到,我明显地将我的列和相关列值命名为与我将如何在下面的答案中进行调整相对应.请注意,以便熟悉哪些列名称可以从哪里获得您正在寻找的结果.
import numpy as np
import pandas as pd
from numpy.core.defchararray import add
np.random.seed([3,1415])
n = 20
cols = np.array(['key', 'row', 'item', 'col'])
arr1 = (np.random.randint(5, size=(n, 4)) // [2, 1, 2, 1]).astype(str)
df = pd.DataFrame(
add(cols, arr1), columns=cols
).join(
pd.DataFrame(np.random.rand(n, 2).round(2)).add_prefix('val')
)
print(df)
key row item col val0 val1
0 key0 row3 item1 col3 0.81 0.04
1 key1 …Run Code Online (Sandbox Code Playgroud) 前几天我学到了一些关于SQL的简单知识:
SELECT c FROM myTbl GROUP BY C
Run Code Online (Sandbox Code Playgroud)
结果与:
SELECT DISTINCT C FROM myTbl
Run Code Online (Sandbox Code Playgroud)
我很好奇,SQL引擎处理命令的方式有什么不同,还是它们真的是同一个东西?
我个人更喜欢不同的语法,但我相信它更多地出于习惯而不是其他任何东西.
编辑:这不是关于聚合的问题.的使用GROUP BY与聚合函数了解.
public class ConsolidatedChild
{
public string School { get; set; }
public string Friend { get; set; }
public string FavoriteColor { get; set; }
public List<Child> Children { get; set; }
}
public class Child
{
public string School { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string Friend { get; set; }
public string Mother { get; set; }
public string FavoriteColor { get; set; }
} …Run Code Online (Sandbox Code Playgroud) 我想知道如何编写此查询.
我知道这个实际的语法是假的,但它会帮助你理解我想要的东西.我需要这种格式,因为它是一个更大的查询的一部分.
SELECT distributor_id,
COUNT(*) AS TOTAL,
COUNT(*) WHERE level = 'exec',
COUNT(*) WHERE level = 'personal'
Run Code Online (Sandbox Code Playgroud)
我需要在一个查询中返回所有内容.
此外,它需要在一行,所以以下将不起作用:
'SELECT distributor_id, COUNT(*)
GROUP BY distributor_id'
Run Code Online (Sandbox Code Playgroud) 如果我有一张桌子
CREATE TABLE users (
id int(10) unsigned NOT NULL auto_increment,
name varchar(255) NOT NULL,
profession varchar(255) NOT NULL,
employer varchar(255) NOT NULL,
PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)
我希望获得所有独特的profession字段值,更快(或推荐):
SELECT DISTINCT u.profession FROM users u
Run Code Online (Sandbox Code Playgroud)
要么
SELECT u.profession FROM users u GROUP BY u.profession
Run Code Online (Sandbox Code Playgroud)
?
可能重复:
SQL中的GROUP BY /聚合函数混淆
我收到了一个错误 -
列'Employee.EmpID'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.
select loc.LocationID, emp.EmpID
from Employee as emp full join Location as loc
on emp.LocationID = loc.LocationID
group by loc.LocationID
Run Code Online (Sandbox Code Playgroud)
这种情况符合Bill Karwin给出的答案.
修正以上,适合ExactaBox的答案 -
select loc.LocationID, count(emp.EmpID) -- not count(*), don't want to count nulls
from Employee as emp full join Location as loc
on emp.LocationID = loc.LocationID
group by loc.LocationID
Run Code Online (Sandbox Code Playgroud)
原始问题 -
对于SQL查询 -
select *
from Employee as emp full join Location as loc
on emp.LocationID = loc.LocationID
group by (loc.LocationID) …Run Code Online (Sandbox Code Playgroud) 我使用pandas作为db替代品,因为我有多个数据库(oracle,mssql等),我无法为SQL等价物创建一系列命令.
我在DataFrame中加载了一些表,其中包含一些列:
YEARMONTH, CLIENTCODE, SIZE, .... etc etc
Run Code Online (Sandbox Code Playgroud)
在SQL中,要计算每年不同客户端的数量,请执行以下操作:
SELECT count(distinct CLIENTCODE) FROM table GROUP BY YEARMONTH;
Run Code Online (Sandbox Code Playgroud)
结果就是
201301 5000
201302 13245
Run Code Online (Sandbox Code Playgroud)
我怎么能在熊猫中做到这一点?
我有一张看起来像这个来电者'makerar'的桌子
cname | wmname | avg
--------+-------------+------------------------
canada | zoro | 2.0000000000000000
spain | luffy | 1.00000000000000000000
spain | usopp | 5.0000000000000000
Run Code Online (Sandbox Code Playgroud)
我想为每个cname选择最大平均值.
SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;
Run Code Online (Sandbox Code Playgroud)
但我会收到一个错误,
ERROR: column "makerar.wmname" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;
Run Code Online (Sandbox Code Playgroud)
所以我这样做
SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;
Run Code Online (Sandbox Code Playgroud)
但这不会给出意图的结果,并显示下面的错误输出.
cname | wmname | max
--------+--------+------------------------
canada …Run Code Online (Sandbox Code Playgroud) 这里有很多类似的问题,但我认为没有充分回答这个问题.
我会从当前最流行的问题继续,并使用他们的例子,如果这没关系.
此实例中的任务是获取数据库中每个作者的最新帖子.
示例查询产生不可用的结果,因为它并不总是返回的最新帖子.
SELECT wp_posts.* FROM wp_posts
WHERE wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY wp_posts.post_author
ORDER BY wp_posts.post_date DESC
Run Code Online (Sandbox Code Playgroud)
目前接受的答案是
SELECT
wp_posts.*
FROM wp_posts
WHERE
wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY wp_posts.post_author
HAVING wp_posts.post_date = MAX(wp_posts.post_date) <- ONLY THE LAST POST FOR EACH AUTHOR
ORDER BY wp_posts.post_date DESC
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个答案简单明了,并且在很多情况下产生的结果不如原始查询那么稳定.
我最好的解决方案是使用表单的子查询
SELECT wp_posts.* FROM
(
SELECT *
FROM wp_posts
ORDER BY wp_posts.post_date DESC
) AS wp_posts
WHERE wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY wp_posts.post_author
Run Code Online (Sandbox Code Playgroud)
我的问题是一个简单的问题: 无论如何在分组之前订购行而不诉诸子查询?
编辑:这个问题是另一个问题的延续,我的情况细节略有不同.您可以(并且应该)假设还有一个wp_posts.id,它是该特定帖子的唯一标识符.