我目前正在办公桌上约。 7.5十六行和十六列。其中一行是我们在大学使用的内部标识符(让我们称之为ID)。另一列包含一个字符串。
因此,ID不是行的唯一索引,因此一个标识符可能在表中出现多次 - 两行之间的唯一区别是字符串。
我需要查找所有带ID的行,并保留一个具有最长字符串的行并删除原始表中的每隔一行。不幸的是,我更像是一个SQL新手,而且我真的陷入了困境。所以,如果有人可以提供帮助,这将是非常好的。
答案 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只有一个最长的字符串。