2017-02-23 60 views
0

我有一个表,其中有名称,组名和值。每个组名都始终显示为单个名称。如果组名称显示为单个名称,则组名称字段始终为空。名称可以属于一个组,但不是必需的。我给你下面的例子:查询有条件地查找组的最大值

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数据混合来获得它。不过,我想知道哪种方法是最好的方法来实现它,并且如果可以通过单个查询获得相同的结果?

回答

0

大多数SQL-ic方式是使用单个SQL查询。

计算两个不同的值可以用一个CASE expressioncorrelated 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)。)

+0

非常感谢!如果GroupColumn不为空,它会得到最大值,如果GroupColumn为空,我会认为最大值(v)。因此,行'group2 | | 1,000'只会导致'group2 | group2 | 1,000',尽管group2的最大值应该是30,000。你怎么看? –

+0

我的确认为我没有足够的想法...... –

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后面使用带有子选择的圆括号。