在我的示例中,根据与该变量关联的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
答案 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];