SQL Server过滤唯一的最新日期和付款

时间:2018-06-17 17:27:33

标签: sql sql-server

在我的示例中,根据与该变量关联的PAY的数量,存在多个相同的EMPID。但是,对于每个PAY和EMPID,只有1个日期。我想要展示的是每个EMPID的最新支付。转而只会在结果中留下不同的EMPID。以下代码是我到目前为止所做的,对我来说这个代码并没有那么好。

导致错误:在预期条件的上下文中指定的非布尔类型的表达式,接近'。'。

对此的任何帮助都会很棒。

SELECT
    [EMPID],
    MAX([DATE]) AS 'last_date',
    [PAY] 
FROM TABLE1
GROUP BY [EMPID]
HAVING
    (SELECT [PAY] 
    FROM TABLE1
    WHERE [DATE] = MAX([DATE])
    GROUP BY [EMPID])
GO

3 个答案:

答案 0 :(得分:1)

要回答您的错误:

你的拥有条款是错误的。您的子查询必须返回值的布尔值。但如果付费是一个值,它必须与某些东西比较(即> 0 ??)

但您可以按如下方式重写查询:

您只会获得包含最长日期的行(表示如下:不存在具有相同VARIABLE1且下一个日期的另一行)

试试这个:

SELECT t1.*
FROM table1 t1
WHERE NOT EXISTS(
    SELECT 'NEXT'
    FROM table1 t2
    WHERE t2.variable1 = t1.variable1
    AND t2.date > t1.date
)

答案 1 :(得分:1)

一种方法是:

SELECT e.*
FROM TABLE1 e
WHERE e.[DATE] = (SELECT MAX(e2.[DATE])
                  FROM TABLE1 e2
                  WHERE e2.EMPID = e.EMPID
                 );

这似乎与您尝试的最接近。 <{1}}上的索引的性能应该很好,查询的意图非常明确。

编写查询的更常见方法可能是使用(EMPID, DATE)row_number()

rank()

此版本每SELECT e.* FROM (SELECT e.*, ROW_NUMBER() OVER (PARTITION BY EMPID ORDER BY [DATE] DESC) as seqnum FROM TABLE1 e ) e WHERE seqnum = 1; 只保证一行,即使EMPID具有相同最大日期的多行。 EMPID将获得所有行,就像您的查询一样。

答案 2 :(得分:0)

为什么不这样:

SELECT 
    t.*
FROM
    [Table] t
INNER JOIN
     (
         SELECT 
             MAX([Date])
             [VARIABLE1]
         FROM 
              [TABLE]
         GROUP BY
               [VARIABLE1]
       ) t2
ON
    t2.[VARIABLE1] = t.[VARIABLE1] AND
    t.[DATE] = t2.[DATE];