2017-02-23 54 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後面使用帶有子選擇的圓括號。