【问题标题】:MS ACCESS - OFFSET with WHERE clauseMS ACCESS - 带有 WHERE 子句的 OFFSET
【发布时间】:2017-01-10 18:04:47
【问题描述】:

问题

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

我正在尝试按 [Awardee]、[State]、[City] 分组,这应该是一个独特的人,我想获得他们最近的第二个 [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   |
 -------------------------------------

偏移解决方法示例

通过按降序选择前 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 查询将获取他们最近的获奖年份(记录仅在上方 1 行有 astricks 的地方)。但是正如我们所看到的,如果我用上面的 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]

【问题讨论】:

    标签: sql ms-access where-clause offset


    【解决方案1】:

    我没有访问 MS 的权限,
    但我会向您展示如何使用基本 SQL 功能在 MySql 上执行此操作: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 上运行。

    【讨论】:

    • 哇哦,正如我所怀疑的那样。有一种方法可以通过 JOIN 做到这一点。非常聪明地JOIN 将桌子放在自己的桌子上,然后GROUP BY 将结果限制在一个获奖者身上。我看到你是如何加入ONyear 的,这比它本身少获得上一行。感谢您为解决这个问题所做的辛勤工作! SQLFiddle 确实有助于证明这是一个可行的解决方案!
    猜你喜欢
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多