Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 每组的结果_Sql_Postgresql_Group By - Fatal编程技术网

Sql 每组的结果

Sql 每组的结果,sql,postgresql,group-by,Sql,Postgresql,Group By,更新: 在is_active=false之后可能有is_active=true,因此我需要获取最后分配的is_active=true并获取前面的is_active=false记录 我有一张这种结构的桌子 id (not pk but each group is incremental), name, grp, is_active (boolean) 第1组的数据如下 1, name1, group1, true 2, name2, group1, true 3, name3, group1,

更新:

在is_active=false之后可能有is_active=true,因此我需要获取最后分配的is_active=true并获取前面的is_active=false记录

我有一张这种结构的桌子

id (not pk but each group is incremental), name, grp, is_active (boolean)
第1组的数据如下

1, name1, group1, true
2, name2, group1, true
3, name3, group1, false
4, name1, group1, false
5, name2, group1, true
6, name3, group1, false <-- this is the next assigned id as the preceding record has an is_active = true
7, (names will differt, group the same and all false)...
所以我想要的回报是:

group1, 6
group2, 105
但我只有

group2, 105

您只需要找到第一个
id
,其中
处于活动状态=false
。无需对
id
应用“大于第一个激活”条件

SELECT MIN(id), grp
  FROM tbl_1
  WHERE is_active = false
  GROUP BY grp
更新:

对最新问题的答复:

SELECT min(id), grp
  FROM tbl_1 t
  WHERE is_active = false
  AND id > (SELECT max(id) 
              FROM tbl_1 
              WHERE is_active = true 
                AND grp = t.grp)
  GROUP BY grp;

对不起,我已经更新了这个问题,我将为所有正确回答上一个问题的人投赞成票。更新了我的问题,你能再看一看吗?所以基本上你想要第一个
id
,其中
is\u active=false
,后面不是一个
id
具有
is\u active=true
?“查找将返回下一个id的查询,其中每个组的is_active=false”这句话似乎不适合您的更新。这就是为什么我有子选择来获取最后一个is_active=true记录idhmm,它仍然只给我一个结果集,而不是三个?我这里有一个很好的虚拟示例:你真的有两个不同的组名吗?更新了我的问题,你能再看一看吗?更新了我的问题,你能再看一看吗?
SELECT grp, MIN(id) FROM tbl_1 WHERE is_active = false GROUP BY grp;
SELECT MIN(id), grp
  FROM tbl_1
  WHERE is_active = false
  GROUP BY grp
SELECT min(id), grp
  FROM tbl_1 t
  WHERE is_active = false
  AND id > (SELECT max(id) 
              FROM tbl_1 
              WHERE is_active = true 
                AND grp = t.grp)
  GROUP BY grp;
SELECT 
grp,
MIN(Id)
FROM tbl_1
WHERE is_active = false 
GROUP BY grp