【问题标题】:Query first five requests for companies using sql使用sql查询公司的前五个请求
【发布时间】:2012-05-17 14:23:43
【问题描述】:

我只需要从我的数据库中列出对公司的前五个请求。我有两个名为 Request 和 Company 的表。对于给定的公司,可能有任何数量的请求。但是,我只需要查询并列出数据库中所有公司的前 5 个请求。

select top 5 *
from Request as r 
    INNER JOIN Company c
    ON r.Company_id=c.Company_ID

我已经完成了上述查询,但它只返回表中的前五个而不是所有成员的前五个。如何更正我的查询?

【问题讨论】:

  • 您需要指定 ORDER BY 以便 Sql Server 知道您想要哪些行。因此,如果有 date_column,并且您想按日期返回前 5 个,请添加 order by date_column

标签: asp.net sql sql-server sql-server-2008


【解决方案1】:
    With r 
    as
    (select  *, row_number() over(partition by Company_id order by RequestDate) as rown
    from Request as)
    Select *
from r join Company c on c.Company_id=r.Company_id
    Where rown<=5

【讨论】:

  • @Josh,这就是你想要的。这叫做分区。
【解决方案2】:

认为您正在查找您的公司表中存在的每家公司的前 5 个请求。在这种情况下,您可以在子选择中rank() 公司的每个请求,然后选择排名在哪里&lt;= 5

select company_id, request_id
from
    ( select c.company_id, r.request_id, rank() over (partition by c.company_id order by request_id) as Rank
    from request r
    inner join company c on
        r.company_id = c.company_id
    ) ranked
where rank <= 5

【讨论】:

  • 您需要像partition by c.company_id 一样在分区语句中限定company_id。否则,您会得到一个模棱两可的列错误。 (这就是我在 sqlfiddle 中得到的。)
【解决方案3】:

您需要按确定“第一”的字段排序。大概是这样的:

按 r.RequestDate 排序

【讨论】:

    【解决方案4】:
    ;WITH companyrecords 
         AS (SELECT Company.*, 
                    Row_number() OVER (partition BY r.Company_id ORDER BY 
                    r.Company_id 
                    ASC) 
                       AS 
                    RowNumber 
             FROM   Request AS r 
                    INNER JOIN Company c 
                      ON r.Company_id = c.Company_ID) 
    SELECT * 
    FROM   companyrecords 
    WHERE  RowNumber <= 5 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多