我有类似的数据:
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;']
答案 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