当前位置: 首页 > 知识库问答 >
问题:

MySQL-查找具有相同值的连续行块的开始和结束

颜举
2023-03-14

我需要提取和迁移值从一个表到另一个。源表包含一个特定的生效日期的sumarated值。如果一个值被更改,如果组件值上的数据从此生效日期开始有效,则会写入新行。

我现在需要将这些数据迁移到这样的新表中。我们的目标是,选择给定月份的数据,结果就是给定该月份的有效数据。

每行表示在一个月内有效的组件的值。我现在通过将其设置为参数来运行每个有效月份的插入更新。我插入值变化作为新的行到表中,通过使用唯一的键(entity_id,effective_date,component_type)防止重复

    SET @effective_date = '2020-01-01';
    INSERT INTO component_final 
       select NULL,
              source_id, 
              entity_id,
              effective_date,
              NULL,
              1,
              component_1 
       FROM component_source 
       WHERE effective_date = @effective_date 
       AND component_1>0;

迁移第一行后,应该是这样的结果

    SET @effective_date = '2020-05-01';
    INSERT INTO component_final 
       select NULL,
              source_id, 
              entity_id,
              effective_date,
              NULL,
              1,
              component_1 
       FROM component_source 
       WHERE effective_date = @effective_date 
       AND component_1>0;

迁移第二行后,应该是这样的结果

因此,如果将来有值变化,必须设定结束日期。

如果组件将来发生更改,我无法执行第二步,即更新数据。也许在插入具有相同实体和组件的新行后,可以将其作为触发器,但我无法使其工作。

一些想法?我想只在MySQL里面处理这个。

共有2个答案

汪同
2023-03-14

我知道核心问题是如何找到组件发生变化的source_ids(0意味着删除,所以我们不希望这些条目出现在结果中),以及如何同时分配相应的结束日期。为了便于说明,我把你的例子简化了一点:

  • 只有一个组件类型(我考虑到可能会有连续的条目,其值不变)
  • 只有一个实体_id,所以我们可以忽略它

将这个更简单的版本扩展到现实世界的问题应该很容易。

下面是一个示例输入:

上官德寿
2023-03-14

您不需要表中的列enddatecomponent_final,因为它的值取决于同一表中的其他值:

SELECT
   id,
   source_id,
   entity_id,
   startdate,
   (  SELECT DATE_ADD(MIN(cf2.startdate),INTERVAL -1 DAY) 
      FROM component_final cf2 
      WHERE cf2.startdate > cf1.startdate
        AND cf2.source_id = cf1.source_id
        AND cf2.entity_id = cf1.entity_id
   ) as enddate,
   component_type,
   value
FROM component_final cf1;
 类似资料:
  • 问题内容: 在[成员]表中,某些行的列值相同。 有些人使用了不同的login_id,但是使用了相同的电子邮件地址,因此在此列上未设置唯一约束。现在,我需要查找这些行,并查看是否应将其删除。 我应该使用什么SQL语句查找这些行?(MySQL 5) 问题答案: 此查询将为您提供电子邮件地址及其使用次数的列表,最常用的地址在前。 如果要完整行:

  • 假设我有一个如下所示的数据框,我需要识别每行,其中一个或多个缺失值 (NA) 后跟至少一个有效值(任何数字)。你可以帮我吗?

  • 问题内容: 我在从表中显示正确的数据时遇到了麻烦。我不太确定要搜索什么。我不确定min(column)或max(column)在这里对我有帮助。让我们看看我是否可以解释我的问题。 我的表包含以下数据: 我将以一种观点来介绍这一点。它将按代码分组。 我想要的是此输出: 如您所见,DateTo和DateFrom之间是否存在间隙,我希望将其显示为两行。但是,如果具有相同代码的下一个“ DateFrom”

  • 问题内容: 我有这样的桌子 我想获得具有相同发明编号的订单数量总和 那就是想要这样的结果 我们如何编写mysql查询 问题答案: 利用聚合函数并根据进行分组。 GROUP BY子句

  • 问题内容: 我遇到一个问题,当执行两个表的联接时,无法确定mysql查找具有两个特定“标签”和相同“ hashid”的链接 假设我的表看起来像这样: 链接 标签 我想返回同时具有“有用”和“很棒”标签的行 当前(工作/快速)查询,用于按1个标签查找链接: 阅读文章后,我尝试使用以下内容: 这 不 工作,但它是如此令人难以置信的缓慢,因为无法使用。 有人知道解决方案吗? 问题答案: 问题的类型称为

  • 问题内容: 我试图找到具有重复值,但仅基于选定的列数,而不是单个列或整个行的行。例如,如果我的表如下所示: 我的问题是: 查找行的“地址和状态”字段与另一行的“地址和状态”字段匹配的行的所有ID。 该查询的答案将是: 有任何想法吗? 意见建议: 如何从单个表中选择同一行中的多列值 问题答案: 请尝试以下方法: