如果键重复,则返回最长的字符串

时间:2018-12-22 18:08:11

标签: sql excel vba

我有类似的数据:

   key   value
   k1    string1
   k2    Other string 
   k3    Long string 
   k1    
   k3    string  

其中一些可能是空的。

如果键重复,我想返回最长的值。所以结果应该像这样:

   key   value
   k1    string1
   k2    Other string 
   k3    Long string 

我的代码(带有解决备忘录字段的汇总):

"IIF(COUNT(key)=1, " & _
                    "MAX(IIF(LEN(value)>250, " & _
                                          "'[CUT]' & LEFT(value, 245), " & _
                                            value & "))," & _
                    "MAX(IIF(LEN(value)>250, " & _
                                            "'[[CUT]' & LEFT(value, 245) & ']', " & _
                                            "'[' & value & ']' ))) AS " & value 

问题是我想从重复项中返回最长的字符串。现在,我使用MAX函数,但是此返回值由于字母顺序而异,因此如果value为空,则返回空。

我正在使用ADOp和

获取数据
[Excel 12.0;Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Extended Properties=IMEX=1;TypeGuessRows=1;ImportMixedTypes=Text'HDR=YES;']

3 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

select t.*
from t
where len(t.value) = (select max(len(t2.value))
                      from t t2
                      where t2.key = t.key
                     );

答案 1 :(得分:0)

我提供了这个答案,该答案可以处理相同长度的多个my_value值。

这可以使用MAX以任意方式解决此问题,并假定MAX长度的所有值都具有相同的适用性。

@TheImpaler在评论中指出,根据您的数据集和需求,可能需要执行此步骤。

SELECT CAST('k1' as varchar(2)) as my_key, CAST('string1' as varchar(100)) as my_value INTO my_table;

INSERT INTO my_table VALUES('k1', NULL);
INSERT INTO my_table VALUES('k2', 'Other string'); 
INSERT INTO my_table VALUES('k2', 'sneak string'); 
INSERT INTO my_table VALUES('k2', NULL);
INSERT INTO my_table VALUES('k3', 'Long string');
INSERT INTO my_table VALUES('k3', 'string');
INSERT INTO my_table VALUES('k3', 'sneaky');

WITH s1
as
(
SELECT t.my_key
      ,COUNT(DISTINCT t.my_value) as my_value_options_total_count
      ,MAX(LEN(t.my_value)) as my_value_max_len  
  FROM my_table t
 WHERE t.my_value IS NOT NULL
GROUP BY t.my_key
)
SELECT t.my_key
     ,s1.my_value_options_total_count
     ,COUNT(DISTINCT t.my_value) as my_value_options_max_len_count
     ,MAX(t.my_value) as my_value_resolved
  FROM my_table t INNER JOIN s1
    ON t.my_key = s1.my_key
   AND LEN(t.my_value) = s1.my_value_max_len
 GROUP BY t.my_key,s1.my_value_options_total_count
 ORDER BY t.my_key;

本文在Common Table Expressions中有更多介绍。

这是结果...

+----+--------+------------------------------+--------------------------------+-------------------+
|    | my_key | my_value_options_total_count | my_value_options_max_len_count | my_value_resolved |
+----+--------+------------------------------+--------------------------------+-------------------+
|  1 | k1     |                            1 |                              1 | string1           |
|  2 | k2     |                            2 |                              2 | sneak string      |
|  3 | k3     |                            3 |                              1 | Long string       |
+----+--------+------------------------------+--------------------------------+-------------------+

我使用this tool创建了ASCII表。希望这可以帮助您入门。

答案 2 :(得分:0)

基于戈登的解决方案,我添加了一个外部group by来处理相同长度的重复字符串:

select id,min(val) val from my_table t
where len(val)=(
  select max(len(t2.val))
  from my_table t2
  where t2.id= t.id
)
and len(val)>0 
group by id 

您可以在这里找到有效的演示:https://rextester.com/KTSF40897