我正在尝试找出逻辑,以便在 IN 命令中为所有类别生成前 200 个结果.(T-SQL)

  • 本文关键字:T-SQL 结果 IN 命令 sql sql-server-2008 tsql
  • 更新时间 :
  • 英文 :


所以代码我现在有以下代码:

select top 200 employees,phone_no,address,job_code
from from employee
where code IN  ('BA', 'QA', 'BI')

所以我希望产生的结果是BA的前 200 个结果,然后是 QA 的前 200 个结果和 BI 的前 200 个结果。因此,它应该填充的总记录将是 600。当前代码将仅填充 200。我可以做工会命令,但它很长。在这种情况下寻找有效的解决方案。

虽然我认为Union是解决此问题的适当方法,但您可能还可以使用 Window 函数获取按code分区的行号,然后在外部查询中对其进行限制:

SELECT employees,
  phone_no,
  address,
  job_code,
FROM
    (
     select employees,
        phone_no,
        address,
        job_code,
        ROW_NUMBER() OVER (PARTITION BY CODE) as code_rownumber
     from from employee
     where code IN  ('BA', 'QA', 'BI')
    )subquery
WHERE subquery.code_rownumber <=200

这很有可能花费的时间超过SELECT TOP 200... UNION SELECT TOP 200... UNION SELECT TOP 200...,因为需要对每条记录进行row_number(),并且只有在该记录之后才能限制在少于 200 个。

此外,奇怪的是,

您想要前 200 名,但您没有指定排序顺序。在上面的窗口函数中,如果要指定排序方式,可以执行以下操作:

ROW_NUMBER() OVER (PARTITION BY CODE ORDER BY job_code DESC) as code_rownumber

我们按job_code降序排序,以code分区中每条记录的编号。

试试这个,将查询分成 3 个子查询并合并结果。例如,如果我必须在"A"和"B"中选择分类的前 2 条记录查询将是,

从产品总计 1 中选择前 2 个产品 ID1,收入 1,其中类别在 ('A')联盟从产品总计1中选择前2个产品ID1,收入1,其中类别为IN("B"(

希望这有帮助!

最新更新