MS ACCESS - 带有 WHERE 子句的 OFFSET
MS ACCESS - OFFSET with WHERE clause
问题
我想查询的是我数据中每个 "grouping" 的第二个结果。例如,带星号的行。
我正在尝试对 [Awardee]、[State]、[City] 进行分组,这应该是一个独特的人,我想获得他们最近的第 2 个 [Year]。
OFFSET 函数可以解决这个问题,但 MS ACCESS 的库中没有。我查找了将 TOP n
与嵌套查询一起使用的解决方法,但在使用该解决方法时会产生更多问题。我可以使用某种类型的 JOIN
语句来完成此操作吗?
示例数据
------------------------------------
|_Awardee_|_State_|_City__|_Year___|
| John | OH | Cinci | 2015 |
*| John | OH | Cinci | 2013 |
| John | OH | Cinci | 2011 |
| Margret| IN | Indy | 2015 |
*| Margret| IN | Indy | 2012 |
| Margret| IN | Indy | 2011 |
| Bob | IN | Indy | 2011 |
*| Bob | IN | Indy | 2010 |
| Jeff | OH | Cinci | 2016 |
*| Jeff | OH | Cinci | 2015 |
| Jeff | OH | Cinci | 2013 |
| Jeff | OH | Cinci | 2012 |
| Susan | IN | Indy | 2012 |
| Spencer| IN | Indy | 2016 |
*| Spencer| IN | Indy | 2015 |
-------------------------------------
示例 OFFSET 解决方法
通过按降序选择前 2 条记录,然后按升序选择前 1 条记录,我可以将结果偏移 1。
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 行)。但是正如我们所看到的,如果我用上面的 OFFSET 解决方法替换子查询,我最终会得到 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,
但我会在 MySql 上使用基本 SQL 功能向您展示如何进行操作:JOIN+GROUP BY + 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
演示:http://sqlfiddle.com/#!9/690e47/7
我相信你会设法让它在 MS Access 上运行。
问题
我想查询的是我数据中每个 "grouping" 的第二个结果。例如,带星号的行。
我正在尝试对 [Awardee]、[State]、[City] 进行分组,这应该是一个独特的人,我想获得他们最近的第 2 个 [Year]。
OFFSET 函数可以解决这个问题,但 MS ACCESS 的库中没有。我查找了将 TOP n
与嵌套查询一起使用的解决方法,但在使用该解决方法时会产生更多问题。我可以使用某种类型的 JOIN
语句来完成此操作吗?
示例数据
------------------------------------
|_Awardee_|_State_|_City__|_Year___|
| John | OH | Cinci | 2015 |
*| John | OH | Cinci | 2013 |
| John | OH | Cinci | 2011 |
| Margret| IN | Indy | 2015 |
*| Margret| IN | Indy | 2012 |
| Margret| IN | Indy | 2011 |
| Bob | IN | Indy | 2011 |
*| Bob | IN | Indy | 2010 |
| Jeff | OH | Cinci | 2016 |
*| Jeff | OH | Cinci | 2015 |
| Jeff | OH | Cinci | 2013 |
| Jeff | OH | Cinci | 2012 |
| Susan | IN | Indy | 2012 |
| Spencer| IN | Indy | 2016 |
*| Spencer| IN | Indy | 2015 |
-------------------------------------
示例 OFFSET 解决方法
通过按降序选择前 2 条记录,然后按升序选择前 1 条记录,我可以将结果偏移 1。
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 行)。但是正如我们所看到的,如果我用上面的 OFFSET 解决方法替换子查询,我最终会得到 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,
但我会在 MySql 上使用基本 SQL 功能向您展示如何进行操作:JOIN+GROUP BY + 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
演示:http://sqlfiddle.com/#!9/690e47/7
我相信你会设法让它在 MS Access 上运行。