SQL-先按匹配记录排序
我需要帮助订购这个名为“季节”的表,方法是将实际日期与开始日期匹配SQL-先按匹配记录排序,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我需要帮助订购这个名为“季节”的表,方法是将实际日期与开始日期匹配 ID NAME BEGINDATE ----------- -------------------- ---------- 1 2014-2015 2014-10-01 2 2015-2016 2015-10-01 3 2016-2017 2016-10-
ID NAME BEGINDATE
----------- -------------------- ----------
1 2014-2015 2014-10-01
2 2015-2016 2015-10-01
3 2016-2017 2016-10-01
4 2017-2018 2017-10-01
例如:
实际日期为2016/10/28,因此我们处于2016-2017赛季id=3
所以结果应该是
ID NAME BEGINDATE
----------- -------------------- ----------
3 2016-2017 2016-10-01
1 2014-2015 2014-10-01
2 2015-2016 2015-10-01
4 2017-2018 2017-10-01
更新已解决
我最后做的是:
DECLARE @IDACTIVE AS INT = (SELECT MAX(ID) FROM SEASON WHERE BEGINDATE < GETDATE())
SELECT
1 AS ORDERBY,
ID,
NAME,
BEGINDATE
FROM SEASON
WHERE ID = @IDACTIVE
UNION
SELECT
2 AS ORDERBY,
ID,
NAME,
BEGINDATE
FROM SEASON
WHERE ID = @IDACTIVE
首先将所有未来日期移到末尾,然后按beginDate排序
SELECT *
FROM season
ORDER BY CASE WHEN beginDate > GETDATE() THEN 0 ELSE 1 END,
beginDate
首先将所有未来日期移到末尾,然后按beginDate排序
SELECT *
FROM season
ORDER BY CASE WHEN beginDate > GETDATE() THEN 0 ELSE 1 END,
beginDate
遵循下一种方法:
1使用Top和Where子句获取唯一匹配的行
2获取除第1点上的记录外的所有记录
3使用UNION ALL组合两个选择的结果
演示:-
结果是:
遵循下一种方法:
1使用Top和Where子句获取唯一匹配的行
2获取除第1点上的记录外的所有记录
3使用UNION ALL组合两个选择的结果
演示:-
结果是:
我认为使用窗口函数最容易做到这一点:
select s.*
from season s
order by (case when begindate = max(case when getdate() >= begindate then begindate end) over ()
then 1 else 2
end),
id
我认为使用窗口函数最容易做到这一点:
select s.*
from season s
order by (case when begindate = max(case when getdate() >= begindate then begindate end) over ()
then 1 else 2
end),
id
这很接近,但不太接近。如果有两行的beginDate>getdate,则无法知道将首先返回哪一行。结果集不是询问者所要求的。-在这里查看您的结果集表单:这很接近,但不完全在那里。如果有两行的beginDate>getdate,则无法知道将首先返回哪一行。结果集不是询问者所要求的。-在这里检查结果集表单:如果向每个结果集添加显式排序器列,则实际上可以控制结果。您在这里的查询没有order by,因此在特定时间返回的结果是偶然的。它工作得非常完美@SeanLange你是对的,但对我来说,重要的是第一条记录。@SeanLange-我添加了另一个解决方案,请检查并等待你的反馈第二个解决方案根本不起作用。您拥有top 1,但没有订购人。因此,如果有两行符合where谓词,您查询的结果可能有效,也可能无效。@ahmedabdelqader尽管本文是关于聚集索引的,但排序同样适用于这种情况。如果向每个结果集添加显式排序器列,则实际上可以控制结果。您在这里的查询没有order by,因此在特定时间返回的结果是偶然的。它工作得非常完美@SeanLange你是对的,但对我来说,重要的是第一条记录。@SeanLange-我添加了另一个解决方案,请检查并等待你的反馈第二个解决方案根本不起作用。您拥有top 1,但没有订购人。因此,如果有两行符合where谓词,您查询的结果可能有效,也可能无效。@ahmedabdelqader尽管本文是关于聚集索引的,但排序同样适用于这种情况。