我有一个数据库表(比如学生(,其中包含以下示例数据
Name ID Active admissionDate ReleaseDate Nationality
John 3572 1 06/02/2014 06/02/2018 0
Sandy 2748 1 06/02/2013 11/01/2016 1
现在我想选择总共 10000 名学生。第一个条件是活动 = 1(假设有 7000 名这样的学生(。第二个条件是国籍 = 1(其余 3000 名学生作为所需学生总数为 10K(。全部按入院日期计算
我想在这里实现的目标应该是总共 10000 名学生,但第一优先级将是活动 = 1,第二优先级将是国籍 = 1。最初,我根据第一个条件选择学生并存储在临时表中。然后我从 10000 中扣除临时表的计数,并选择剩余的具有第二个条件的学生并再次附加到临时表中。
但是我想在一次查询中实现它,因为原始表非常大并且需要太多执行时间。如果您需要更多说明,请告诉我。
您可以将order by
与所需的条件一起使用:
select top (1000) s.*
from students s
order by (case when Active = 1 then 1
when Nationality = 1 then 2
else 3
end),
AdmissionDate desc;
这假设您首先想要最近的录取。 如果您首先想要最早的,只需删除desc
即可。
这有点在黑暗中刺痛,但我认为这很容易通过ORDER BY
和CASE
的表达来解决。然而,这是伪sql:
WITH Students AS(
SELECT TOP 10000 [YourColumns]
FROM Student S
ORDER BY CASE WHEN Active = 1 THEN 1 ELSE 0 END DESC
CASE WHEN Nationality = 1 THEN 1 ELSE 0 END DESC
CASE WHEN ... )
SELECT *
FROM Students
ORDER BY AdmissionDate;
这意味着您不会在WHERE
子句中限制数据集,但是,需要首先对数据进行排序,首先将处于活动状态的数据推到顶部,然后是国籍为 1 的数据,依此类推。