选择每组具有最大日期的记录时出错

时间:2018-07-18 00:59:39

标签: sql sql-server

当我尝试运行下面的代码时,出现以下错误, “在需要条件的上下文中,在','附近指定了非布尔类型的表达式。” 我不理解为什么当我仅运行类似的查询时,此查询为什么返回错误不使用日期。任何帮助将不胜感激,谢谢!

SELECT *
FROM [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION] AS CLASS_DEV
WHERE (CLASS_DEV.State, Eff_Date) = (SELECT State, Max(Eff_Date) FROM [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION])

3 个答案:

答案 0 :(得分:1)

我认为SQL Server不支持多列的IN子句(尽管MySQL支持)。但是我们只能在这里使用TOP

SELECT TOP 1 *
FROM [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION]
ORDER BY Eff_Date DESC;

实际上,我认为查询的字面翻译将使用TOP 1 WITH TIES,因此,如果您希望所有记录都可能与最大有效日期挂钩,则可以尝试用上面的方法代替上面的代码。

如果您想查找具有最近生效日期的每个州的记录,那么我们可以使用ROW_NUMBER

SELECT *
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY State ORDER BY Eff_Date DESC) rn
    FROM [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION] 
) t
WHERE rn = 1;

同样,如果您想要联系,可以将ROW_NUMBER替换为RANK

答案 1 :(得分:0)

SQL Server不支持带有in的元组。没有子查询的一种替代方法是:

select top (1) with ties w.*
from [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION] w
order by rank() over (partition by state order by eff_date desc);

另一种方法使用相关的子查询:

select w.*
from [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION] w
where w.eff_date = (select max(w2.eff_date)
                    from [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION] w2
                    where w2.state = w.state
                   );

答案 2 :(得分:0)

实际上,如果没有示例输入/输出数据,向您发送最佳和正确的查询会有些困难。

但是如错误消息和给定查询中所示,很明显,Where子句中不能具有元组结构...

您需要使用上述方法之一或以下方式重写查询:

SELECT CLASS_DEV1.*
FROM [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION] AS CLASS_DEV1
    INNER JOIN [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION] AS CLASS_DEV2
        ON CLASS_DEV1.State = CLASS_DEV2.State
GROUP BY CLASS_DEV1.State,
         CLASS_DEV1.Eff_Date
HAVING MAX(CLASS_DEV2.Eff_Date) = CLASS_DEV1.Eff_Date