我有一个复杂的查询,为了简单起见,我暂时将其结果存储在一个临时表中。我有一个逗号=分隔的三个字符唯一标识符组合的列表,例如下面的屏幕截图:
您可以在第 2 行和第 3 行中看到 3 个字符标识符相同,但顺序相反。计数不同,但这些值是正确的(如果 X 和 Y 的人口规模不相等,则具有 X 和 Y 的人数与具有 Y 和 X 的人数不同)。我想找到所有药物的独特组合,无论它们出现的顺序如何。我设想类似于 arow_number()
的分区,它为第 2 行和第 3 行提供 1 和 2。
我从来没有在 SQL 中尝试过这样的事情,但我的想法是这样的
select *,
case when LEN(alldrugs)-LEN(replace(alldrugs,',',''))= 1 then 2
when LEN(alldrugs)-LEN(REPLACE(alldrugs,',',''))= 2 then 3
when LEN(alldrugs)-LEN(REPLACE(alldrugs,',',''))= 3 then 4
when LEN(alldrugs)-LEN(REPLACE(alldrugs,',',''))= 4 then 5
when LEN(alldrugs)-LEN(REPLACE(alldrugs,',',''))= 5 then 6
else 1 end as numDrugs
from #testfix as tf
order by alldrugs,numDrugs
由于列表是用逗号分隔的,该case when
语句查找一行中的逗号数并给出要查找的 3 位跨度数。对于包含 2 种药物(一个逗号)的 alldrugs 列,我可以将结果设为 CTE,在该 CTE 上自行加入并检查是否right(alldrugs,3) = left(alldrugs,3)
. 这显然是不可扩展的。有没有一种惯用的方法来获得这样的独特组合?