Sql 如何通过在特定列中使用不同的值来执行结果限制?
假设我有这个数据集Sql 如何通过在特定列中使用不同的值来执行结果限制?,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,假设我有这个数据集 Player Team Date_Played John Smith New York 2/25/2014 Joe Smith New York 2/25/2014 Steve Johnson New York 2/25/2014 Steph Curry Orlando 2/25/2014 Frank Anthony Orlando 2/26/2014 Brian Smit
Player Team Date_Played
John Smith New York 2/25/2014
Joe Smith New York 2/25/2014
Steve Johnson New York 2/25/2014
Steph Curry Orlando 2/25/2014
Frank Anthony Orlando 2/26/2014
Brian Smith Bulls 2/26/2014
Steve Johnson Bulls 2/27/2014
Steph Curry Bulls 2/28/2014
Ben Smith Bulls 3/28/2014
我想知道如何编写一个查询,返回每个队一半的球员数量。我希望它看起来像这样:
Player Team Date_Played
John Smith New York 2/25/2014
Joe Smith New York 2/25/2014
Steph Curry Orlando 2/25/2014
Brian Smith Bulls 2/26/2014
Steve Johnson Bulls 2/27/2014
我考虑过尝试使用LIMIT或TOP命令,但我不知道如何编写查询来根据特定列中的不同值限制结果。
有什么想法吗?这可能吗?您可以使用窗口功能。我会使用
row\u number()
和count()
:
或
percentile()
或其他。为什么使用PL/SQL?这可以在一个简单的SQL查询中完成。哪一半?为什么是John和Joe,而不是Steve?@wolφi似乎有一种常见的误解,即PL/SQL与“使用Oracle数据库的SQL”相同,而不是“Oracle关系数据库中SQL的过程语言扩展”因此,问题经常会被错误地标记——只需更正标记/标题即可删除对PL/SQL的不适当引用。感谢@MT0的更正
select t.*
from (select t.*, count(*) over (partition by team) as cnt,
row_number() over (partition by team order by team) as seqnum
from t
) t
where seqnum <= 0.5 * cnt;
select t.*
from (select t.*,
ntile(2) over (partition by team order by team) as tile
from t
) t
where tile = 1;