excel - 如何将 1 添加到 Excel 中最近的重复行?

标签 excel if-statement repeat

我有一个数据集,在 excel 中有 60+ 千行和大约 20 列。 “ID 列”有时会重复自己,我想添加一个仅在最近的行中返回 1 的列,如果它重复的话。

这是示例。我有…

    ID            DATE       ColumnX
    AS1         Jan-2013      DATA
    AS2         Feb-2013      DATA
    AS3         Jan-2013      DATA
    AS4         Dec-2013      DATA
    AS2         Dec-2013      DATA

我想…
    ID            DATE       ColumnX      New Column
    AS1         Jan-2013      DATA            1
    AS2         Feb-2013      DATA            0
    AS3         Jan-2013      DATA            1
    AS4         Dec-2013      DATA            1
    AS2         Dec-2013      DATA            1 

我一直在尝试使用排序和嵌套 if 的组合,但这取决于我的数据始终处于相同的顺序(以便它查找前一行中的 ID)。

加分点:如果我的数据集对于 excel 来说相当大,那么可以考虑使用不会占用处理器的最有效代码!

最佳答案

您可以使用的一种方法是将 MSQuery 指向您的表并使用 SQL 来应用业务规则。从好的方面来说,这运行得非常快(在我对 64k 行的测试中只需要几秒钟)。一个巨大的缺点是查询引擎似乎不支持超过 64k 行的 Excel 表,但可能有办法解决这个问题。无论如何,我会提供解决方案,以防它给您一些想法。

设置首先给你的数据集一个命名范围。我叫它MYTABLE .节省。接下来在第 1 行中选择表格右侧的一个单元格,然后单击 Data | From other sources | from Microsoft Query .选择Excel Files* | OK ,浏览您的文件。查询向导应打开,显示 MYTABLE可用,添加所有列。点击取消(真的),然后点击Yes ,您想继续编辑。

应该会打开 MSQuery 界面,点击 SQL按钮并将代码替换为以下内容。您将需要编辑一些细节,例如文件路径。 (另外,请注意我使用了不同的列名。这纯粹是我的偏执狂。Jet 引擎非常挑剔,我想在构建它时排除与保留字的冲突。)

SELECT 
    MYTABLE.ID_X, 
    MYTABLE.DATE_X, 
    MYTABLE.COLUMN_X, 
    IIF(MAXDATES.ID_x IS NULL,0,1) * IIF(DUPTABLE.ID_X IS NULL,0,1) AS NEW_DATA
FROM ((`C:\Users\andy3h\Desktop\SOTEST1.xlsx`.MYTABLE MYTABLE 
        LEFT OUTER JOIN (
            SELECT MYTABLE1.ID_X, MAX(MYTABLE1.DATE_X) AS MAXDATE
            FROM `C:\Users\andy3h\Desktop\SOTEST1.xlsx`.MYTABLE MYTABLE1
            GROUP BY MYTABLE1.ID_X
            ) AS MAXDATES
        ON MYTABLE.ID_X = MAXDATES.ID_X
        AND MYTABLE.DATE_X = MAXDATES.MAXDATE)
    LEFT OUTER JOIN (
        SELECT MYTABLE2.ID_X
        FROM `C:\Users\andy3h\Desktop\SOTEST1.xlsx`.MYTABLE MYTABLE2
        GROUP BY MYTABLE2.ID_X
        HAVING COUNT(1) > 1
        ) AS DUPTABLE
    ON MYTABLE.ID_X = DUPTABLE.ID_X)

使用适当的代码 MSQuery 将提示无法以图形方式表示查询。它是 OK .查询将执行 - 在此阶段运行可能需要比预期更长的时间。我不知道为什么,但它应该在后续刷新时运行得更快。一旦结果返回,File | Return data to Excel .接受“导入数据”对话框中的默认值。

这就是技术。要针对新数据刷新查询,只需 Data | Refresh .如果您需要调整查询,您可以通过 Excel 通过 Data | Connections | Properties | Definition tab 返回它。 .

我提供的代码返回您的原始数据加上 NEW_DATA 列,其值为 1如果 ID 重复并且日期是该 ID 的最大日期,否则 0 .如果 ID 的最大日期在多行上,则此代码不会整理平局。所有这些行都将被标记为 1 .

编辑:很容易修改代码以忽略重复逻辑并显示所有 ID 的最新行。只需更改 SELECT 的最后一位从句阅读
IIF(MAXDATES.ID_x IS NULL,0,1) AS NEW_DATA

在这种情况下,您还可以删除最后的 LEFT JOIN别名 DUPTABLE .

关于excel - 如何将 1 添加到 Excel 中最近的重复行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20913559/

相关文章:

c - 我应该将用户输入的验证码放在哪里

php - 变量中的 If 逻辑(谓词表达式)

html - 使用图像 repeat-x 固定导航

python - 如何使用函数本身返回的值重复函数?

excel - 检查特定列中的文本后删除行

Python openpyxl 读取到空单元格

Excel 每行分隔一个单元格值

java - 替代 If...else-if

JavaScript 如果答案正确,则生成新字符串

arrays - 以字段名作为参数的 VBA 数组排序