Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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_Oracle_Greatest N Per Group - Fatal编程技术网

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;