我有一张桌子,我有名字,组名和值。每个组名称始终也显示为单个名称。如果组名称显示为单个名称,则组名称字段始终为空。名称可以属于某个组,但不是必需的。我举几个例子:
Name Group Value
-----------------------
name1 | group1 | 10,000
name2 | group1 | 12,000
name3 | group2 | 9,000
group1| | 40,000
name4 | group2 | 30,000
name5 | | 11,000
group2| | 1,000
name6 | group1 | 19,000
我希望从每个单独的名称中获得以下结果:
根据上面的例子,结果应如下所示:
Name Group Max(V)
-----------------------
name1 | group1 | 40,000
name2 | group1 | 40,000
name3 | group2 | 30,000
group1| group1 | 40,000
name4 | group2 | 30,000
name5 | name5 | 11,000
group2| group2 | 30,000
name6 | group1 | 40,000
我知道如何通过两个单独的查询和一些python数据混合来获取它。但是我想知道哪个是实现它的最pythonic方式,并且是否可以通过一个查询得到相同的结果?
答案 0 :(得分:0)
最SQL-ic方式是使用单个SQL查询。
使用CASE expression和correlated subquery:
可以计算两个不同的值SELECT Name,
CASE WHEN GroupColumn IS NOT NULL
THEN GroupColumn
ELSE Name
END AS "Group",
(SELECT max(Value)
FROM MyTable AS T2
WHERE T2.GroupColumn = MyTable.GroupColumn
OR T2.Name = MyTable.GroupColumn
) AS "Max(V)"
FROM MyTable;
(但是有一个helper function来替换NULL值; GroupColumn
的整个表达式可以简化为ifnull(GroupColumn, Name)
。)
答案 1 :(得分:0)
.headers on
.mode column
.width 1 8 8 8
with
data as (
select 1 n,'name1' name, 'group1' groupcol, 10000 v union
select 2 n,'name2' name, 'group1' groupcol, 12000 v union
select 3 n,'name3' name, 'group2' groupcol, 9000 v union
select 4 n,'group1' name, null groupcol, 40000 v union
select 5 n,'name4' name, 'group2' groupcol, 30000 v union
select 6 n,'name5' name, null groupcol, 11000 v union
select 7 n,'group2' name, null groupcol, 1000 v union
select 8 n,'name6' name, 'group1' groupcol, 19000 v
),
data2 as (select ifnull(groupcol,name) groupcol,* from data)
select
n,
name,
groupcol,
(select max(v) from data2 where groupcol=d.groupcol) maxv
from data2 d
order by n;
结果:
n name groupnum maxv
- -------- -------- --------
1 name1 group1 40000
2 name2 group1 40000
3 name3 group2 30000
4 group1 group1 40000
5 name4 group2 30000
6 name5 name5 11000
7 group2 group2 30000
8 name6 group1 40000
您需要SQLite版本3.8.3(2014)或更新版本才能理解WITH子句。如果你有一个旧版本,sql很容易重写,只需使用带有FROM后面的子选择的括号。