SQL Query为每个项目提取一定数量的结果

时间:2014-07-09 04:56:38

标签: sql limit-per-group

我正在寻找一种更好的方法来生成一个只使用sql而不是C#的列表。看起来很简单,我做错了

假设我有一个名为PhoneNumbers的表,其中包含Number / City / State

示例(但数百万个数字):

NUMBER          CITY        STATE
555-555-5555    New York    NY
111-111-1111    Los Angeles CA
222-222-2222    Houston     TX
333-333-3333    Miami       FL

我需要一个可以从每个州返回10个电话号码的查询

现在我个人只是对所有50个州运行查询,然后将它们组合在一个数据集中,但它是一个大数据库,所以它很慢,我希望有一个简单的方法只需撤回我需要的数据。

3 个答案:

答案 0 :(得分:0)

以下查询应该适用于Oracle和SQL Server,但不适用于MySQL:

with cte as
(select number, city, state,
 row_number() over (partition by state order by state) rn
 from yourtable)

select number,city,state
from cte
where rn <= 10

请注意,如果您需要按特定字段排序的前10行,则必须调整order by以满足您的需求。

答案 1 :(得分:0)

它有所不同,但对于MSSQL:

with cteByStateas (
   select row_number() over (partition by STATE order by CITY) as RowNo,
          number,
          city,
          state
)
select * 
  from cteByState
 where RowNo <= 10

请注意,您没有指定您想要的前10个号码,或者它们是否应该是随机的

对于mysql,使用变量

会有所不同

答案 2 :(得分:0)

您只需使用UNION ALL子句即可。这样的事情: -

(SELECT NUMBER, CITY, STATE FROM TABLE_NAME WHERE STATE = 'NY' ORDER BY CITY LIMIT 10)
UNION ALL
(SELECT NUMBER, CITY, STATE FROM TABLE_NAME WHERE STATE = 'CA' ORDER BY CITY LIMIT 10)
UNION ALL
(SELECT NUMBER, CITY, STATE FROM TABLE_NAME WHERE STATE = 'TX' ORDER BY CITY LIMIT 10)
UNION ALL
(SELECT NUMBER, CITY, STATE FROM TABLE_NAME WHERE STATE = 'FL' ORDER BY CITY LIMIT 10)

希望这可以帮到你。