【发布时间】:2015-04-13 05:26:50
【问题描述】:
我的问题
假设我有一个返回以下数据的查询:
id date
-- ------
1 2015-01-12
1 ... // here I might have X more rows
1 2015-06-30
2 2015-01-12
2 ... // here I might have Y more rows
2 2015-05-20
...
鉴于 X, Y >= 120 and X != Y 和查询的顺序是 id, date ASC 我想要一种方法来检索 id 1 的记录号 120 和 id 2 的记录号 120(对于每个不同的 ID 依此类推),类似于:
id date
-- --------
1 2015-03-24 // this is the record 120 for id = 1
2 2015-04-26 // this is the record 120 for id = 2
...
请注意,日期不是按顺序排列的(您可能在一行和下一行之间有间隔)。
我的问题有直接的 SQL 解决方案吗?(我知道我可以使用 vba 来实现我的目标,但我宁愿继续使用 SQL)
作为澄清说明,请参阅此示例。给定以下结果集:
id date
-- ------
1 2015-01-12 // this is record 1 for id = 1
1 2015-01-13 // this is record 2 for id = 1
1 2015-01-20 // this is record 3 for id = 1
1 2015-01-21 // this is record 4 for id = 1
...
1 2015-03-22 // this is record 118 for id = 1
1 2015-03-23 // this is record 119 for id = 1
1 2015-03-24 // this is record 120 for id = 1
1 2015-03-25 // this is record 121 for id = 1
...
1 2015-06-30 // this is the last row for id = 1
2 2015-01-12 // this is record 1 for id = 2
2 2015-01-13 // this is record 2 for id = 2
...
2 2015-04-25 // this is record 120 for id = 2
...
2 2015-05-20 // this is the last record for id = 2
结果应该是:
id date
-- --------
1 2015-03-24
2 2015-04-26
请记住,每个 ID 至少有 120 条记录,这是事实(我有一个查询,只给出超过 119 条记录的 ID)
尝试的解决方案
我尝试使用SELECT TOP 指令,但我无法获得我想要的结果,因为我无法直接应用它:我不想要前 120 名,然后得到我想要的最后一行每个 ID 的 TOP 120 中的最后一个。
为(一秒)澄清而编辑
我的目标是:
SELECT id, 120thRow(date)
FROM table
GROUP BY id;
可惜我不知道如何在access中实现120thRow功能。
【问题讨论】:
-
记录号是多少?您的问题似乎缺少一些重要的信息。数据中的某列是否为“120”?
-
不,我在另一个查询中使用 120 条件来获取结果。我尝试(但失败了)解释每个 ID 我有超过 120 条记录(这是事实),我希望每个 ID 都有 120 条记录。我会尝试编辑并使其更清晰
-
我认为你应该澄清更多。为什么除了id 1还有2015-03-24?它不是第一个,不是最后一个,不是最小值或最大值。为什么会在那里?
-
@LaszloTenki,这是棘手的部分。这不是最后一个,最小或最大。我需要 120 个计数并且我没有自动编号,因为这是一个查询并且自动数字字段已损坏。如果它直接来自任何聚合函数的调用,那么使用 group by 和聚合将非常容易。
-
再问:你总是需要120,即使你有更多?似乎是这样,但我想确定一下。所以当你有 x 时,当 x 120 时你需要 120?
标签: sql ms-access ms-access-2003