0

我犹豫要不要问,因为我确定它就在那里,但我似乎无法想出关键字来找到答案。我从子查询(通常是 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_IDand max SEQ_NUM,然后有第二个查询使用原始表和连接中的第一个查询来获取其余部分。

我怎样才能在一个查询中做到这一点?

例子:

TECH_ID    SEQ_NUM    PELL
1          1          4000
1          2          4000
1          3          5000

仅使用序列号的最大值仍然返回:1; 2; 40001; 3; 5000我只想要后者时。

4

3 回答 3

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_NBRSELECTSEQ_NBRGROUP BY

在不相关的注释中,您可以使用表别名使查询更短且更易于阅读。例如:

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;

Edit2:我在下面阅读了您关于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;
于 2012-10-11T21:08:30.703 回答
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;
于 2012-10-11T21:11:59.797 回答
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
于 2012-10-11T23:30:03.380 回答