Sql 选择第一组 问题定义

Sql 选择第一组 问题定义,sql,sqlite,subquery,correlated-subquery,Sql,Sqlite,Subquery,Correlated Subquery,我有一个SQL查询,看起来像: SELECT * FROM table WHERE criteria = 1 ORDER BY group; 结果 我得到: group | value | criteria ------------------------ A | 0 | 1 A | 1 | 1 B | 2 | 1 B | 3 | 1 预期结果 但是,我想将结果仅限于第一组(在本例中为A)

我有一个SQL查询,看起来像:

SELECT *
    FROM table
    WHERE criteria = 1
    ORDER BY group;
结果 我得到:

group | value | criteria
------------------------
  A   |  0    |   1
  A   |  1    |   1
  B   |  2    |   1
  B   |  3    |   1
预期结果 但是,我想将结果仅限于第一组(在本例中为A)。即

我试过的 分组 我可以使用
GROUP BY
子句聚合组,但这会给我:

group | value
-------------
  A   |  0
  B   |  2
或者每组的一些聚合函数。但是,我不想聚合这些行

子查询 我还可以指定分组方式子查询:

SELECT *
  FROM table
 WHERE criteria = 1 AND 
       group = (
                       SELECT group
                         FROM table
                        WHERE criteria = 1
                        ORDER BY group ASC
                        LIMIT 1
                   );

这是可行的,但子查询总是很混乱。特别是,这需要为
标准
指定my
WHERE
子句两次。当然,必须有一种更干净的方法来做到这一点。

您可以尝试以下查询:-

SELECT *
FROM table
WHERE criteria = 1
AND group = (SELECT MIN(group) FROM table)
ORDER BY value;

如果数据库支持WITH子句,请尝试此操作。这类似于使用子查询,但只需指定一次
条件
输入。也更容易理解发生了什么

with main_query as (
  select *
  from table
  where criteria = 1
  order by group, value
),
with min_group as (
  select min(group) from main_query
)
select *
from main_query
where group in (select group from min_group);
  -- this where clause should be fast since there will only be 1 record in min_group
使用稠密的_秩()


我想他想要的是第一组符合他的标准,而不是第一组整体。
SELECT *
FROM table
WHERE criteria = 1
AND group = (SELECT MIN(group) FROM table)
ORDER BY value;
with main_query as (
  select *
  from table
  where criteria = 1
  order by group, value
),
with min_group as (
  select min(group) from main_query
)
select *
from main_query
where group in (select group from min_group);
  -- this where clause should be fast since there will only be 1 record in min_group
DECLARE @yourTbl AS TABLE (
    [group] NVARCHAR(50),
    value INT,
    criteria INT
)

INSERT INTO @yourTbl VALUES ( 'A', 0, 1 )
INSERT INTO @yourTbl VALUES ( 'A', 1, 1 )
INSERT INTO @yourTbl VALUES ( 'B', 2, 1 )
INSERT INTO @yourTbl VALUES ( 'B', 3, 1 )

;WITH cte AS
(
   SELECT i.* , 
   DENSE_RANK() OVER (ORDER BY i.[group]) AS gn
   FROM @yourTbl AS i
   WHERE i.criteria = 1
)
SELECT *
FROM cte
WHERE gn = 1


group | value | criteria
------------------------
A     | 0     | 1     
A     | 1     | 1