python - 如何对不同长度的 "identical"字符串进行 GROUP BY?

标签 python mysql group-by

我有一个赞美诗实例数据库,它们出现在各种赞美诗书中。 该表的设置大致如下:

CREATE TABLE `Hymns` (
  `HymnID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `HymnbookID` int(11) DEFAULT NULL,
  `HyNumber` int(11) DEFAULT NULL,
  `HyName` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `HyFirstLine` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `HyFirstLineDif` tinyint(1) NOT NULL DEFAULT '0',
  `SongID` int(11) DEFAULT NULL,
  `TextID` int(11) DEFAULT NULL,
  `TuneID` int(11) DEFAULT NULL,
  PRIMARY KEY (`HymnID`),
  KEY `HymnbookID` (`HymnbookID`),
  KEY `SongID` (`SongID`)
) ENGINE=MyISAM AUTO_INCREMENT=134381 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `Hymns` (`HymnID`, `HymnbookID`, `HyNumber`, `HyName`,
  `HyFirstLine`, `HyFirstLineDif`, `SongID`, `TextID`, `TuneID`)
VALUES (642, 1, 26, 'Joseph Smith’s First Prayer',
  'Oh, how lovely was the morning', 1, 26, 26, 26);

有时第一行是相同的,但在不同的地方切断 - 有时它们是不同的(字母 A 和 B 不在数据库中,我只是将它们放入以显示相同和不同):

Oh, how lovely was the morning [A]

Oh, how lovely [A]

Oh, how lovely was the morning! Radiant beamed [A]

O how lovely was the morning! [B]

是否可以仅返回唯一第一行的最长版本,如下所示?:

Oh, how lovely was the morning! Radiant beamed [A]

O how lovely was the morning! [B]

这是我到目前为止的查询:

SELECT HyFirstLine
FROM Hymns
WHERE TextID = 26 AND HyFirstLine IS NOT NULL
GROUP BY HyFirstLine

编辑:数据作为字典列表返回到Python。根据评论,也许用Python进行事后过滤更好?我不确定我会如何去做。添加Python标签。

最佳答案

编辑:这是针对 MSSQL,而不是 mySQL。我很抱歉。希望下面的引用资料可以帮助您。

未经测试,但您可能需要一个具有如下内容的存储过程:

DECLARE @HyFirstLine varchar(255);
DECLARE @StoredHyFirstLine varchar(255);

DECLARE @OutputTable Table(HyFirstLine varchar(255))

DECLARE hy_cursor CURSOR FOR  
SELECT HyFirstLine FROM Hymns;

OPEN hy_cursor;  

FETCH NEXT FROM hy_cursor  
INTO @HyFirstLine;  

WHILE @@FETCH_STATUS = 0  
BEGIN  

   IF NOT EXISTS(SELECT * FROM @OutputTable WHERE HyFirstLine like @HyFirstLine+'%')
     BEGIN
       INSERT INTO @OutputTable(HyFirstLine) VALUES(@HyFirstLine)
     END
   ELSE
     BEGIN
       SET @StoredHyFirstLine = (SELECT HyFirstLine FROM @OutputTable WHERE HyFirstLine like @HyFirstLine+'%')

       IF LEN(@HyFirstLine) > LEN(@StoredHyFirstLine)
         BEGIN
           UPDATE @OutputTable SET HyFirstLine = @HyFirstLine WHERE HyFirstLine like @HyFirstLine+'%'
         END
     END

   FETCH NEXT FROM hy_cursor  
   INTO @HyFirstLine;  
END  

CLOSE hy_cursor;  
DEALLOCATE hy_cursor;  

SELECT * FROM  @OutputTable

关于python - 如何对不同长度的 "identical"字符串进行 GROUP BY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38628620/

相关文章:

mysql - 执行存储过程失败时出错

php - 按一天中的小时分组,然后计算每组中的#

MySQL - COUNT、GROUP BY、ORDER BY 并获取最新日期时间

Python Scapy --arp 请求和响应

python - 获取列表中项目的错误值?设计问题还是逻辑问题?

php - LAMP #1045 - 用户 'root' @'localhost' 的访问被拒绝(使用密码 : NO))

MySQL 双左连接、条件 OR 和组

python - 如何获取大型文本文件数据的统计信息

python - 使用 pyparsing,如何解析以反斜杠结尾的带引号的字符串

java - 对于无限运行的查询,哪个是更好的 Java 程序或存储过程