Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql MS ACCESS-使用WHERE子句进行偏移 问题_Sql_Ms Access_Where Clause_Offset - Fatal编程技术网

Sql MS ACCESS-使用WHERE子句进行偏移 问题

Sql 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

我试图查询的是数据中每个分组的第二个结果。例如,带有星号的行

我试图在[获奖者]、[州]、[市]上分组,这应该是一个独特的人,我想得到他们最近的第二个[年度]

偏移量函数可以解决该问题,但MS ACCESS的库中没有该函数。我查找了使用TOP n和嵌套查询的变通方法,但是在使用变通方法时会产生更多的问题。我可以用某种类型的JOIN语句来实现这一点吗

样本数据 示例偏移解决方法

通过按降序选择前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行。但是,正如我们所看到的,如果我用上面的偏移解决方案替换子查询,我将得到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