Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-先按匹配记录排序_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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尽管本文是关于聚集索引的,但排序同样适用于这种情况。