Condense Rows by Comments Column

时间:2014-03-19 16:26:43

标签: sql ms-access access-vba

我有一个名为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之外使用外部依赖,除非我无法做我想做的事情。

1 个答案:

答案 0 :(得分:1)

您在这里寻找的措辞是您想要一个“连续的数据块”。这也可以称为“间隙和岛屿”问题,因为您正在寻找具有某些共享属性的数据“孤岛”。这里有一个很好的页面来处理SQL中的连续块:http://gcbenison.wordpress.com/2011/09/26/queries-that-group-tables-by-contiguous-blocks/

  

“一个简单的GROUP BY语句不会在这里做,因为我们不只是想要一组符合我们条件的所有行;我们希望保留行的顺序并找到每个连续块的第一行和最后一行那么如何做到这一点,假设在SELECT语句中没有“查看下一行”或“查看最后一行”函数?关键是将表连接到自身,偏移一行。“

现在这种确切的方法可能对您的问题不起作用,但阅读本文可以帮助您找到答案。与他们的解决方案一样,您可能需要将表连接到自身并执行更多分析。如果失败,那么谷歌搜索“SQL连续块”或“SQL间隙和岛屿”将使您更接近解决方案。