Sql找到最长String的Row并删除Rest

时间:2017-07-28 06:43:37

标签: sql-server string

我目前正在办公桌上约。 7.5十六行和十六列。其中一行是我们在大学使用的内部标识符(让我们称之为ID)。另一列包含一个字符串。

因此,ID不是行的唯一索引,因此一个标识符可能在表中出现多次 - 两行之间的唯一区别是字符串。

我需要查找所有带ID的行,并保留一个具有最长字符串的行并删除原始表中的每隔一行。不幸的是,我更像是一个SQL新手,而且我真的陷入了困境。所以,如果有人可以提供帮助,这将是非常好的。

2 个答案:

答案 0 :(得分:0)

看一下这个样本:

SELECT * INTO #sample FROM (VALUES
    (1, 'A'),
    (1,'Long A'),
    (2,'B'),
    (2,'Long B'),
    (2,'BB')
) T(ID,Txt)

DELETE S FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY LEN(Txt) DESC) RN
    FROM #sample) S
WHERE RN!=1

SELECT * FROM #sample

<强>结果:

ID  Txt
--  ------
1   Long A
2   Long B

答案 1 :(得分:0)

这可能只是在SQL中,但我知道怎么做的方式是使用应用程序代码的两遍方法 - 我假设你有一个正在编写的应用程序。

第一遍就是:

SELECT theid, count(*) AS num, MAX(LEN(thestring)) AS keepme FROM thetable WHERE num > 1 GROUP BY theid

然后,您将以您正在使用的任何语言循环搜索结果,并删除具有该ID的任何内容,但返回的字符串除外。我所知道的语言是PHP,所以我将它用于我的例子,但该方法在任何语言中都是相同的(为了简洁起见,我正在跳过错误检查,准备好的语句等,而不是测试 - 请使用仔细):

$sql = 'SELECT theid, count(*) AS num, MAX(LEN(thestring)) AS keepme FROM thetable WHERE num > 1 GROUP BY theid';
$result = sqlsrv_query($resource, $sql);
while ($row = sqlsrv_fetch_object($result)) {
  $sql = 'DELETE FROM thetable WHERE theid = '.$row->theid.' AND NOT thestring = '.$row->keepme;
  $result = sqlsrv_query($resource, $sql);
}

如果两个字符串长度相同,你没有说你想做什么,所以这个解决方案根本不处理 - 我假设每个ID只有一个最长的字符串。