Sql MS ACCESS-使用WHERE子句进行偏移 问题
我试图查询的是数据中每个分组的第二个结果。例如,带有星号的行 我试图在[获奖者]、[州]、[市]上分组,这应该是一个独特的人,我想得到他们最近的第二个[年度] 偏移量函数可以解决该问题,但MS ACCESS的库中没有该函数。我查找了使用TOP n和嵌套查询的变通方法,但是在使用变通方法时会产生更多的问题。我可以用某种类型的JOIN语句来实现这一点吗 样本数据 示例偏移解决方法 通过按降序选择前2条记录,然后按升序选择前1条记录,我可以将结果偏移1Sql MS ACCESS-使用WHERE子句进行偏移 问题,sql,ms-access,where-clause,offset,Sql,Ms Access,Where Clause,Offset,我试图查询的是数据中每个分组的第二个结果。例如,带有星号的行 我试图在[获奖者]、[州]、[市]上分组,这应该是一个独特的人,我想得到他们最近的第二个[年度] 偏移量函数可以解决该问题,但MS ACCESS的库中没有该函数。我查找了使用TOP n和嵌套查询的变通方法,但是在使用变通方法时会产生更多的问题。我可以用某种类型的JOIN语句来实现这一点吗 样本数据 示例偏移解决方法 通过按降序选择前2条记录,然后按升序选择前1条记录,我可以将结果偏移1 SELECT TOP 1 * FROM (SE
SELECT TOP 1 * FROM
(SELECT TOP 2 [Awardee], [State], [City], [Year] FROM [Table1]
ORDER BY [Awardee] ASC, [Year] DESC)
ORDER BY [Awardee] ASC, [Year] ASC;
工作SQL
此SQL查询将获得他们最近的获奖年度记录,该记录仅位于astricks上方1行。但是,正如我们所看到的,如果我用上面的偏移解决方案替换子查询,我将得到2个子查询。最内部的子查询将无法重新格式化WHERE子句中的“CDFI1”。MS ACCESS子查询无法查看最近的相邻查询
SELECT *
FROM [T09a: CDFI Award Records] AS CDFI1
WHERE CDFI1.[ID] IN
(SELECT TOP 1 ID FROM [T09a: CDFI Award Records] as CDFI2
WHERE CDFI2.[Awardee] = CDFI1.[Awardee] AND CDFI2.[City] = CDFI1.[City] AND CDFI2.[ST] = CDFI1.[ST]
ORDER BY CDFI2.[Awardee] ASC, CDFI2.[Year] DESC)
ORDER BY CDFI1.Awardee, CDFI1.Year DESC;
编辑:接受答案
感谢@krokodilko在MYSQL中的演示和帮助。要在ACCESS中实现这一点,有一些小的语法怪癖,主要是使用方括号,如下所示
SELECT t.[Awardee], t.[ST], t.[City], max( t.[Year] ) as Year
FROM ([T09a: CDFI Award Records] as t
INNER JOIN (
SELECT [Awardee], [ST], [City], max( [Year] ) as maxYear
FROM [T09a: CDFI Award Records]
GROUP BY Awardee, ST, City
) as x
ON x.Awardee = t.Awardee
AND x.[ST] = t.[ST]
AND x.[City] = t.[City]
AND t.[Year] < x.maxYear)
GROUP BY t.[Awardee], t.[ST], t.[City]
我没有访问MS access的权限,但我将向您展示如何在MySql上使用基本SQL功能进行访问:JOIN+groupby+MAX:
SELECT t.Awardee, t.State, t.City, max( t.Year ) as Year
FROM table1 t
JOIN (
SELECt Awardee, State, City, max( Year ) as Year
FROM table1
GROUP BY Awardee, State, City
) x
ON x.Awardee = t.Awardee
AND x.State = t.State
AND x.City = t.City
AND t.Year < x.year
GROUP BY t.Awardee, t.State, t.City
演示:
我相信你会设法让它在MS Access上工作。Woohoo,正如我所怀疑的那样。有一种方法可以通过连接实现这一点。非常聪明的做法是自己加入表格,然后分组,将结果限制为单个获奖者。我知道你是如何在一个不到一年的时间里加入到前一排的。谢谢你为解决这个问题所付出的努力!SQLFiddle确实有助于证明这是一个有效的解决方案!
SELECT t.Awardee, t.State, t.City, max( t.Year ) as Year
FROM table1 t
JOIN (
SELECt Awardee, State, City, max( Year ) as Year
FROM table1
GROUP BY Awardee, State, City
) x
ON x.Awardee = t.Awardee
AND x.State = t.State
AND x.City = t.City
AND t.Year < x.year
GROUP BY t.Awardee, t.State, t.City