子查询最大序列号

时间:2012-10-11 21:04:18

标签: sql ms-access

我犹豫不决,因为我确定它在那里,但我似乎无法想出关键字来找到答案。我从子查询(通常是Access用户)开始走出我的界限。

我的查询包含TECH_IDSEQ_NBRPELL_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; 40001; 3; 5000

3 个答案:

答案 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
相关问题