我犹豫不决,因为我确定它在那里,但我似乎无法想出关键字来找到答案。我从子查询(通常是Access用户)开始走出我的界限。
我的查询包含TECH_ID
,SEQ_NBR
和PELL_FT_AWD_AMT
SELECT ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID, ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR, ISRS_V_NEED_ANAL_RESULT_PARENT.PELL_FT_AWD_AMT, ISRS_V_NEED_ANAL_RESULT_PARENT.SEQ_NBR
FROM ISRS_V_NEED_ANAL_RESULT_PARENT
GROUP BY ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID, ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR, ISRS_V_NEED_ANAL_RESULT_PARENT.PELL_FT_AWD_AMT, ISRS_V_NEED_ANAL_RESULT_PARENT.SEQ_NBR
HAVING (((ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR)="2013"))
ORDER BY ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID;
我想要返回的是添加一个子查询,只为每条记录选择最大SEQ_NUM
,但我似乎无法正确使用语法。在过去,我会作弊并有一个单独的查询,首先给我TECH_ID
和最大SEQ_NUM
,然后有第二个查询使用原始表和连接中的第一个查询来获取休息。
如何在一个查询中执行此操作?
示例:
TECH_ID SEQ_NUM PELL
1 1 4000
1 2 4000
1 3 5000
当我只想要后者时,仅使用序列号的最大值仍会返回:1; 2; 4000
和1; 3; 5000
。
答案 0 :(得分:4)
如果我误解了你的要求,请原谅我,但似乎这就是你所需要的:
SELECT ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID, ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR, ISRS_V_NEED_ANAL_RESULT_PARENT.PELL_FT_AWD_AMT, MAX(ISRS_V_NEED_ANAL_RESULT_PARENT.SEQ_NBR)
FROM ISRS_V_NEED_ANAL_RESULT_PARENT
GROUP BY ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID, ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR, ISRS_V_NEED_ANAL_RESULT_PARENT.PELL_FT_AWD_AMT
HAVING (((ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR)="2013"))
ORDER BY ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID;
我从原始查询中做出的两项更改是在MAX()
子句中的SEQ_NBR
附近添加SELECT
,并从SEQ_NBR
子句中删除GROUP BY
。
在尿布式笔记上,您可以使用table aliases缩短查询时间并更轻松地阅读。例如:
SELECT p.TECH_ID, p.AWD_YR, p.PELL_FT_AWD_AMT, MAX(p.SEQ_NBR)
FROM ISRS_V_NEED_ANAL_RESULT_PARENT p
GROUP BY p.TECH_ID, p.AWD_YR, p.PELL_FT_AWD_AMT
HAVING (((p.AWD_YR)="2013"))
ORDER BY p.TECH_ID;
编辑: @Slippery Pete非常了解您的HAVING
子句无效。通常,当您想要在详细级别上过滤结果时,请使用WHERE
;如果您想根据汇总信息过滤结果,请使用HAVING
。在这种情况下,您需要WHERE
。
SELECT p.TECH_ID, p.AWD_YR, p.PELL_FT_AWD_AMT, MAX(p.SEQ_NBR)
FROM ISRS_V_NEED_ANAL_RESULT_PARENT p
WHERE p.AWD_YR = "2013"
GROUP BY p.TECH_ID, p.AWD_YR, p.PELL_FT_AWD_AMT
ORDER BY p.TECH_ID;
编辑2:我已在下面看到您对PELL
不同的评论,并且只希望每个TECH_ID
的序列号最高的行。你实际上问的是一个更复杂的问题,因此需要一个更复杂的答案。这是一个可能的SQL查询来获得你想要的,但我不知道MS Access是否支持这些类型的嵌套查询。
SELECT p.TECH_ID, p.AWD_YR, p.PELL_FT_AWD_AMT, p.SEQ_NBR
FROM ISRS_V_NEED_ANAL_RESULT_PARENT p
JOIN (
SELECT TECH_ID, MAX(SEQ_NBR) AS 'SEQ_NBR'
FROM ISRS_V_NEED_ANAL_RESULT_PARENT
GROUP BY TECH_ID
) AS m ON p.TECH_ID = m.TECH_ID AND p.SEQ_NBR = m.SEQ_NBR
WHERE p.AWD_YR = "2013"
ORDER BY p.TECH_ID;
答案 1 :(得分:1)
having
条款对我来说也不起作用;我想出了这个:
SELECT ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID, ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR, ISRS_V_NEED_ANAL_RESULT_PARENT.PELL_FT_AWD_AMT, max(ISRS_V_NEED_ANAL_RESULT_PARENT.SEQ_NBR) as MAX_SEQ_NBR
FROM ISRS_V_NEED_ANAL_RESULT_PARENT
WHERE ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR = '2013'
GROUP BY ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID, ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR, ISRS_V_NEED_ANAL_RESULT_PARENT.PELL_FT_AWD_AMT
ORDER BY ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID;
答案 2 :(得分:1)
我认为您正在寻找类似以下内容的相关子查询:
SELECT p.TECH_ID, p.AWD_YR, p.PELL_FT_AWD_AMT, MAX(p.SEQ_NBR), (SELECT MAX(SEQ_NBR) FROM ISRS_V_NEED_ANAL_RESULT_PARENT p2
WHERE p2.TECH_ID=p.TECH_ID AND p2.AWD_YR = 2013) AS MAX_SEQNBR
FROM ISRS_V_NEED_ANAL_RESULT_PARENT p
WHERE p.AWD_YR = 2013
GROUP BY p.TECH_ID, p.AWD_YR, p.PELL_FT_AWD_AMT
ORDER BY p.TECH_ID
Here's an SQL Fiddle example: http://sqlfiddle.com/#!3/ae484/7