根据最后一个假布尔值[T-SQL]选择最大值

根据最后一个假布尔值[T-SQL]选择最大值,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我想按IsOpen=FALSE的最新结束日期提取最后一条记录 WeekID | EndDate | IsOpen | TransmitDate | 1 2015-03-14 False 2015-03-15 2 2015-03-20 False 2015-03-21 3 2015-03-26 True

我想按IsOpen=FALSE的最新结束日期提取最后一条记录

WeekID   |      EndDate     |    IsOpen   |  TransmitDate  |

 1             2015-03-14         False      2015-03-15
 2             2015-03-20         False      2015-03-21
 3             2015-03-26         True       2015-03-27
 4             2015-04-02         True       2015-04-03
在本例中,我希望获得WeekID、EndDate、IsOpen、TransmitDate 但仅显示最后一行的值为false,而不是所有行的值均为false。在这种情况下

WeekID   |      EndDate     |    IsOpen   |  TransmitDate  |
 2             2015-03-20         False      2015-03-21
我曾尝试将IsOpen的布尔值转换为整数,但我的逻辑在如何让它显示我需要的方面有点错误

SELECT  WeekID, EndDate, IsOpen, TransmitDate FROM dbo.Weeks WHERE IsOpen = (SELECT max(cast(IsOpen as int)) FROM dbo.Weeks)
从我迄今为止的尝试来看,这只会返回所有真实值

谢谢。

top 1与order by组合将返回最后一行

SELECT top 1 WeekID, EndDate, [Open], TransmitDate
FROM dbo.Weeks 
WHERE [Open] = 0
order by EndDate desc

SQL Server中没有布尔类型。您想将带有true/false的列与varchar“true”或“false”进行比较

为什么要将列称为isOpen和Open,正确的名称是什么?日期在确定顺序时是否无关紧要?也就是说,一条记录可能在表中出现得较晚,但可能早于前一条记录。拉取最后一条可能的IsOpen=FALSE记录的目的是什么?请原谅,这意味着根据主键或日期列进行ISOPELAST?日期的顺序很重要。因为我需要最后一个EndDate,可能是基于最后一个IsOpen值为False的EndDate。没有布尔值,但有位数据类型,所以据我所知,除非执行case或IIF之类的操作,否则无法将位与true/False进行比较。@benjaminmoskovits-有关位数据的真/假处理,请参阅。示例:将@Foo声明为bit=1;选择case@Foo当'True'然后'yes'当'False'然后'Nay'结束;。类似地,其中IsOpen='False'。这就是我的全部观点。您不能直接处理true/false。见我之前的评论。@benjaminmoskovits-你能直接详细说明吗?将@Foo声明为位=1;选择42,其中@Foo='True';我觉得这不是太复杂。正如我在示例WHERE子句中提到的,不需要CASE或IIF。