gpt4 book ai didi

sql - MySQL——标记除 1 个匹配行之外的所有行

转载 作者:行者123 更新时间:2023-11-29 02:38:31 24 4
gpt4 key购买 nike

这类似于 this question ,但似乎有些答案与 MySQL 不太兼容(或者我做得不对),而且我花了很多时间来弄清楚我需要的更改。显然,我的 SQL 比我想象的还要生锈。我也希望更改列值而不是删除,但我认为至少 that 部分很简单...

我有一个像这样的表:

rowid SERIALfingerprint TEXTduplicate BOOLEANcontents TEXTcreated_date DATETIME

我想通过指纹为每个组的第一个(按 created_date)设置 duplicate=true。很容易将具有重复指纹的所有行标记为受骗。我遇到的问题是保留第一个。

其中一个填充表格的应用程序会大量加载数据,多个工作人员从不同的来源加载数据,并且工作人员的数据不一定按日期分区,因此尝试将这些全部标记为他们进来了(按日期第一个插入的不一定是第一个)。另外,我已经有一堆数据,我需要以任何一种方式清理。因此,我宁愿只拥有一个相对高效的查询,我可以在批量加载后运行以进行清理,而不是尝试将其构建到该应用程序中。

谢谢!

最佳答案

如果您分组的数据大于 1024 字节,则需要明确告知 MySQL(有关详细信息,请参阅 this link)。因此,如果指纹列中的数据大于 1024 字节,则应使用将 max_sort_length 变量(有关允许值的详细信息,请参见 this link,以及如何设置它的 this link)设置为更大的数字,这样分组依据就不会默默地只使用部分数据进行分组。

一旦您确定 MySQL 将正确分组您的数据,以下查询将设置重复标志,以便第一个指纹记录重复设置为 FALSE/0,任何后续指纹记录重复设置为 TRUE/1:

    UPDATE mytable m1
INNER JOIN (SELECT fingerprint
, MIN(rowid) AS minrow
FROM mytable m2
GROUP BY fingerprint) m3
ON m1.fingerprint = m3.fingerprint
SET m1.duplicate = m3.minrow != m1.rowid;

请记住,此解决方案不考虑 NULL,如果指纹字段可能为 NULL,则您需要额外的逻辑来处理这种情况。

关于sql - MySQL——标记除 1 个匹配行之外的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/242073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com