分组中的第一个值

时间:2014-03-10 19:39:08

标签: sql hiveql

我想根据组中第一个(实际上是唯一的)值在group by表中设置一个列。

具体来说,给出一个表

id   good
1    t
1    t
2    f
3    t

我想制作表格

id    multiplicity  goodN
1     2             0
2     1             0
3     1             1

当且仅当goodN为1且multiplicitygood时,t为1:

select id, count(*) as multiplicity,
       if (count(*) > 1, 0, if(good = 't', 1, 0)) as goodN
from ...

问题是:如何从组中提取good的第一个(仅在我的情况下)值?

PS。是否有更便宜的方法来测试该组的大小为1而不是count(*)=1

4 个答案:

答案 0 :(得分:1)

如果计数为1,那么MAX(好)和MIN(好)都将成为该组中的“第一”行。

select id, count(*) as multiplicity,
       if (count(*) > 1, 0, if(max(good) = 't', 1, 0)) as goodN
from ...

答案 1 :(得分:0)

从...中选择好 其中id =(从...中选择min(id)) 好的> 0)

按ID分组(id)= 1

您可以测试计数(货物)而不是计数(*),最后按ID添加组。仅使用moltiplicity 1记录添加有计数(商品)= 1

答案 2 :(得分:0)

如果是MySQL那么简单地说:

SELECT id,
       good,
       count(*) AS multiplicity,
       if((count(*) > 1 AND good = 't'), @flag := 1, @flag := 0) AS goodN
  FROM goods
GROUP BY good, id;

PS:如果您要我删除我的答案,请告诉我。

答案 3 :(得分:0)

我没有使用hiveql的经验,但这可以在mySql中实现你想要的。我认为应该在hiveql中使用相同的功能。

select t.id, count(*) as multiplicity, 
      (select case count(*) when 1 then 1 else 0 end
         from table1
        where id = t.id
          and good = 't') as goodN
  from table1 t
 group by t.id

<强> sqlFiddle