Sql 选择第一组 问题定义
我有一个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)
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
);
这是可行的,但子查询总是很混乱。特别是,这需要为
标准指定myWHERE
子句两次。当然,必须有一种更干净的方法来做到这一点。您可以尝试以下查询:-
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