我有一个数据集,在 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/