我有一个名为LogIndex
的数据表,其中一片看起来像这样:
rowid fruit test cat_id start_time end_time result comment
165 Apple Peel 2590110 1/23/2014 0:20:35 1/23/2014 0:21:09 Remove rotten
166 Apple Peel 2590211 1/23/2014 0:26:35 1/23/2014 0:27:09 Remove rotten
167 Apple Peel 2590310 1/23/2014 0:32:35 1/23/2014 0:33:09 Remove rotten
168 Apple Peel 2590409 1/23/2014 0:38:35 1/23/2014 0:39:09 Remove rotten
169 Apple Peel 2590509 1/23/2014 0:44:35 1/23/2014 0:45:09 Remove rotten
170 Apple Peel 2590608 1/23/2014 0:50:35 1/23/2014 0:51:09 Remove rotten
252 Apple Peel 3516509 1/24/2014 1:56:35 1/24/2014 1:57:09 Remove rotten
253 Apple Peel 3516607 1/24/2014 2:02:35 1/24/2014 2:03:09 Remove rotten
463 Apple Peel 5485587 1/26/2014 22:56:35 1/26/2014 22:57:09 Remove rotten
464 Apple Peel 5485690 1/26/2014 23:02:35 1/26/2014 23:03:09 Remove rotten
465 Apple Peel 5485791 1/26/2014 23:08:35 1/26/2014 23:09:09 Remove rotten
466 Apple Peel 5485899 1/26/2014 23:14:35 1/26/2014 23:15:09 Remove rotten
467 Apple Peel 5486006 1/26/2014 23:20:35 1/26/2014 23:21:09 Remove rotten
468 Apple Peel 5486118 1/26/2014 23:26:35 1/26/2014 23:27:09 Remove rotten
469 Apple Peel 5486227 1/26/2014 23:32:35 1/26/2014 23:33:09 Remove rotten
470 Apple Peel 5486334 1/26/2014 23:38:35 1/26/2014 23:39:09 Remove rotten
471 Apple Peel 5486436 1/26/2014 23:44:35 1/26/2014 23:45:09 Remove rotten
472 Apple Peel 5486535 1/26/2014 23:50:35 1/26/2014 23:51:09 Remove rotten
473 Apple Peel 5486636 1/26/2014 23:56:35 1/26/2014 23:57:09 Remove rotten
474 Apple Peel 5486747 1/27/2014 0:02:35 1/27/2014 0:03:09 Remove rotten
475 Apple Peel 5486857 1/27/2014 0:08:35 1/27/2014 0:09:09 Remove rotten
其中rowid
=自动增量整数PK和cat_id
是不同表的FK。此数据来自的整个表格包含更多行,并按fruit
列和test
列排序,以自动增量。可以有任意数量的fruit
值,但只有八种类型的test
值。也可能存在无限量的comment
值(它们是人类输入的),但很可能某些值在数据的不同点可能相同。
基本上,我正在尝试编写一个视图,将这些行压缩成如下所示:
rowid fruit test cat_id start_time end_time result comment
165 Apple Peel 2590110 1/23/2014 0:20:35 1/23/2014 0:51:09 Remove rotten
252 Apple Peel 3516509 1/24/2014 1:56:35 1/24/2014 2:03:09 Remove rotten
463 Apple Peel 5485587 1/26/2014 22:56:35 1/27/2014 0:09:09 Remove rotten
我希望MIN()
的{{1}},rowid
MIN()
,cat_id
MIN()
, start_time
MAX()
end_time
,其中有一个连续的行块,其中comment
值都相同。
我知道DLookUp("comment", "LogIndex", "rowid = " & rowid + 1)
会给我下一行的comment
值进行比较,所以我尝试了这样的查询:
SELECT rowid, fruit, type, MIN(cat_id), MIN(start_time), MAX(end_time), result, comment
FROM LogIndex
AND comment IS NOT NULL
AND result IS NOT NULL
GROUP BY fruit, type, rowid, result, comment, start_time, end_time
HAVING DLookup("comment", "LogIndex", "rowid = " & rowid + 1) = comment
ORDER BY fruit, type
除了上面的示例中的最后一行之外,它不会压缩任何东西(可能是因为rowid 171有一个空白或不同的注释而不是170)。
我还有一个几乎的查询,其中添加了一个从另一个表(tsv
)加入的列,每个表的每年,每月和每小时都有一个值。对于" 2014年1月23日00:00:00",示例如2014012300
。查询如下所示:
SELECT li.rowid, li.fruit, li.type, MIN(li.cat_id), MIN(li.start_time),MAX(tsv.end_time), li.result as vetting_results, li.comment
FROM LogIndex as li
INNER JOIN tsv ON tsv.cat_id = li.cat_id
WHERE li.result IS NOT NULL
AND li.comment IS NOT NULL
GROUP BY tsv.collection_id, li.fruit, li.type, li.result, li.comment, tsv.utc_start_datehr
ORDER BY tsv.collection_id, li.fruit, MIN(tsv.start_time), MAX(tsv.end_time);
此查询的唯一问题是,如果有任何评论都不在同一utc_start_datehr
值下,则它们会显示为每小时划分的行。例如,它会将以下rowid组合在一起:463到473和474到475两个单独的行。我希望将463分组为475,因为它们都按顺序(通过rowid)具有comment
的相同值。
如果我有某种方式标记LogIndex
表的每一行都有一个由comment
个值组成的唯一编号,那么我假设我可以通过该方法进行GROUP BY。
如果这更容易,我可以使用VBA,但是我想避免在Access之外使用外部依赖,除非我无法做我想做的事情。
答案 0 :(得分:1)
您在这里寻找的措辞是您想要一个“连续的数据块”。这也可以称为“间隙和岛屿”问题,因为您正在寻找具有某些共享属性的数据“孤岛”。这里有一个很好的页面来处理SQL中的连续块:http://gcbenison.wordpress.com/2011/09/26/queries-that-group-tables-by-contiguous-blocks/
“一个简单的GROUP BY语句不会在这里做,因为我们不只是想要一组符合我们条件的所有行;我们希望保留行的顺序并找到每个连续块的第一行和最后一行那么如何做到这一点,假设在SELECT语句中没有“查看下一行”或“查看最后一行”函数?关键是将表连接到自身,偏移一行。“
现在这种确切的方法可能对您的问题不起作用,但阅读本文可以帮助您找到答案。与他们的解决方案一样,您可能需要将表连接到自身并执行更多分析。如果失败,那么谷歌搜索“SQL连续块”或“SQL间隙和岛屿”将使您更接近解决方案。