我认为从SQL中的子查询中选择值只会从该子集中产生值,直到我在代码中发现一个非常讨厌的错误。这是我的问题的一个例子。
我按日期选择包含最新(最大)功能的行。这正确返回4行,每个函数的最新签入。
select *, max(date) from cm where file_id == 5933 group by function_id;
file_id function_id date value max(date) 5933 64807 1407941297 1 1407941297 5933 64808 1407941297 11 1407941297 5933 895175 1306072348 1306072348 5933 895178 1363182349 1363182349
当仅选择上述子集中的值时,它返回先前日期的函数值,即不属于上述子集的行。您可以在下面看到日期早于第一个子集的结果。
select temp.function_id, temp.date, temp.value
from (select *, max(date)
from cm
where file_id 5933
group by function_id) as temp;
function_id date value 64807 1306072348 1 <-outdated row, not in first subset 64808 1306072348 17 <-outdated row, not in first subset 895175 1306072348 895178 1363182349
我从根本上做错了什么?不应该在子查询上执行选择只返回这些子查询的可能结果吗?
答案 0 :(得分:1)
SQLite允许您使用MAX()来选择GROUP BY返回的行,但这只有在实际计算MAX()时才有效。
当您抛弃max(date)
列时,这将不再有效。
在这种情况下,您实际上想要使用date
值,因此您可以保留MAX():
SELECT function_id,
max(date) AS date,
value
FROM cm
WHERE file_id = 5933
GROUP BY function_id
答案 1 :(得分:0)
您似乎错过了子查询返回给定file_id的所有行的事实。如果要将子查询限制为具有最新日期的rec,则需要使用WHERE NOT EXISTS子句对其进行限制,以检查给定条件是否不存在最近的记录。
答案 2 :(得分:0)
也许我的问题没有正确制定,但是这篇文章有我一直在寻找的解决方案:
https://stackoverflow.com/a/123481/2966951
https://stackoverflow.com/a/121435/2966951
过滤掉最近一行是我的问题。我很惊讶从具有最大值的子查询中进行选择可以产生除该值之外的任何其他内容。