在sql server中获得相同的前1个结果

时间:2016-07-15 04:16:51

标签: sql sql-server

我有这个问题:

SELECT 
    IT_approvaldate 
FROM  
    t_item  
WHERE 
    IT_certID_fk_ind = (SELECT DISTINCT TOP 1 IT_certID_fk_ind 
                        FROM t_item  
                        WHERE IT_rfileID_fk = '4876') 
ORDER BY 
    IT_typesort

运行此查询时的结果:

enter image description here

我需要获得前1名的结果。 (2013-04-27 00:00:00)问题是我选择前1名,获得第2名结果。

enter image description here

我认为这两个结果中列值的原因与列值相同。 请看下面,

enter image description here

但是,我的查询结果只需要IT_approvaldate列前1位。

我该怎么做?任何人都可以帮我解决这个问题吗?

enter image description here

3 个答案:

答案 0 :(得分:1)

您可以使用以下查询并检查

SELECT IT_approvaldate FROM  t_item  WHERE IT_certID_fk_ind =(SELECT DISTINCT top 1 IT_certID_fk_ind FROM  t_item  WHERE IT_rfileID_fk ='4876' ) and IT_approvaldate is not null ORDER BY IT_typesort

这将从结果中删除空值

答案 1 :(得分:1)

TSQL选择查询本质上不具有确定性。您必须添加一个平局或另一行不是。

理论是SQL Server不会假设NULL值大于或小于你的行,并且因为你的select语句在你的HAVING子句之前没有逻辑实现,顺序取决于数据库的设置方式。

了解SQL Server可能不一定两次选择相同的路径,除非它认为它绝对更好。这就是ORDER BY子句的原因,它将一致地处理NULL(假设有一个唯一的分组)。

<强>更新ORDER BY上添加MSDN文档的链接似乎是个好主意。确实,从Standard / MSDN开始是一个好习惯。 ORDER BY Clause - MSDN

答案 2 :(得分:1)

如果您希望NULL成为排序列表中的最后一个值,您可以使用ISNULL子句中的ORDER BYNULL替换为MAX value of DATETIME 下面的代码可能会有所帮助:

SELECT  TOP 1 IT_approvaldate
FROM  t_item 
WHERE IT_certID_fk_ind = (SELECT DISTINCT top 1 IT_certID_fk_ind FROM  t_item  WHERE IT_rfileID_fk ='4876' ) 
ORDER BY IT_typesort ASC, ISNULL(IT_approvaldate,'12-31-9999 23:59:59') ASC;