Sql server 使用SQL选择日期最近的行
我有一个SQL语句Sql server 使用SQL选择日期最近的行,sql-server,date,exists,Sql Server,Date,Exists,我有一个SQL语句 SELECT ID, LOCATION, CODE,MAX(DATE),FLAG FROM TABLE1 WHERE DATE <= CONVERT(DATETIME,'11-11-2012') AND EXISTS (SELECT * FROM #TEMP_CODE WHERE TABLE1.CODE = #TEMP_CODE.CODE) AND ID IN (14, 279) GROUP BY
SELECT
ID, LOCATION, CODE,MAX(DATE),FLAG
FROM
TABLE1
WHERE
DATE <= CONVERT(DATETIME,'11-11-2012')
AND EXISTS (SELECT * FROM #TEMP_CODE WHERE TABLE1.CODE = #TEMP_CODE.CODE)
AND ID IN (14, 279)
GROUP BY
ID, LOCATION, CODE
我只想显示日期小于或等于给定日期的行。要求的结果是
ID LOCATION CODE DATE FLAG
-------------------------------------------------------------------
14 CAR STREET,UDUPI 234 2012-08-10 00:00:00.000 1
279 MADHUGIRI 234 2012-08-11 00:00:00.000 0
这与您要求的结果不一致,但我认为这些结果是错误的,我认为您应该检查它们。按日期限制0,2添加订单 使用order by,您将按照最接近您的条件进行日期排序,其中,使用限制将仅返回前2个值
SET ROWCOUNT 2
SELECT
ID, LOCATION, CODE,MAX(DATE),FLAG
FROM
TABLE1
WHERE
DATE <= CONVERT(DATETIME,'11-11-2012')
AND EXISTS (SELECT * FROM #TEMP_CODE WHERE TABLE1.CODE = #TEMP_CODE.CODE)
AND ID IN (14, 279)
GROUP BY
ID, LOCATION, CODE
ORDER BY DATE
使用子查询获取每个ID的最大日期,然后将其连接到表:
SELECT
ID, LOCATION, CODE, DATE, FLAG
FROM
TABLE1
JOIN (
SELECT ID AS SubID, MAX(DATE) AS SubDATE
FROM TABLE1
WHERE DATE < '11/11/2012'
AND EXISTS (SELECT * FROM #TEMP_CODE WHERE TABLE1.CODE = #TEMP_CODE.CODE)
AND ID IN (14, 279)
GROUP BY ID
) AS SUB ON ID = SubID AND DATE = SubDATE
首先,您为什么使用“11-11-2012”作为日期格式?试试“20121111”。还有,为什么第一排是8月10日而不是8月14日?@Aaron Bertrand我将此作为用户输入。我甚至尝试使用20121111格式,但没有运气返回表中的所有五列记录都是@AdRock LIMIT,SQL Server中不存在。那么,您能解释一下为什么ID=14的“2012-08-10”比“2012-08-14”更接近吗?这正是我认为SQL Server中不存在LIMIT的原因,也没有任何ANSI/ISO SQL标准我没有看到它是SQL因此,这种方式仅更改设置行数2的限制。而ID的硬编码就是他的sql查询。我刚刚添加了订单。这仍然不起作用。您还需要按标志分组,在这种情况下,您可能根本得不到正确的结果,或者您可以对其执行MIN/MAX,但可能会为特定行获得错误的标志。如果我按标志分组,我会得到两行ID为14的数据,而没有行ID为279的数据。如果I MAX flag,我必须转换为tinyint,我得到的标志是1,而不是预期的0。所需的结果应该是小于20121111的行和最接近的行20121111@Prince20120814不是比20120810更接近2012111吗?或者,您是否可以用另一种方式解释为什么要使用带有20120810的行而不是带有20120814的行?我只能用很多种方式问这个问题——现在已经问了3到4次了。请解释清楚。
ID LOCATION CODE [Date] FLAG
--- ---------------- ---- ---------- ----
14 CAR STREET,UDUPI 234 2012-08-14 0
279 MADHUGIRI 234 2012-08-11 0
SET ROWCOUNT 2
SELECT
ID, LOCATION, CODE,MAX(DATE),FLAG
FROM
TABLE1
WHERE
DATE <= CONVERT(DATETIME,'11-11-2012')
AND EXISTS (SELECT * FROM #TEMP_CODE WHERE TABLE1.CODE = #TEMP_CODE.CODE)
AND ID IN (14, 279)
GROUP BY
ID, LOCATION, CODE
ORDER BY DATE
SELECT
ID, LOCATION, CODE, DATE, FLAG
FROM
TABLE1
JOIN (
SELECT ID AS SubID, MAX(DATE) AS SubDATE
FROM TABLE1
WHERE DATE < '11/11/2012'
AND EXISTS (SELECT * FROM #TEMP_CODE WHERE TABLE1.CODE = #TEMP_CODE.CODE)
AND ID IN (14, 279)
GROUP BY ID
) AS SUB ON ID = SubID AND DATE = SubDATE