从我的网上研究中我发现了这个问题的两个答案,我试图远离它。
我无法修改表格或添加新表格,因为该软件是第三方,需要表格保持不变。
我试图远离使用临时表或额外的用户定义函数。
这是我的问题。
数据库中有一列是一个逗号分隔的数字列表,代表一周中的几天,即(1,2,4,5,7
)。
我正在尝试找到一种方法来读取该数据,并找出是否有任何行,其中该列表示连续3天的天数。
应该用
返回任何内容1,2,3
2,3,4
3,4,5
5,6,7
1,,,,,6,7
1,2,,,,,7
但如果列有1,2,3,4,则不应返回两次。有很多行有2,3,4,5,6,我提出的任何解决方案都会返回3次。
最好,我想创建一个存储过程来传递一个数字并查找连续几天的数量。因此,如果传入5,它将查找连续5天标记的任何内容。
除了使用额外的表格之外还有其他选择吗?如果是这样,你能告诉我怎么做这个工作吗?我不是SQL的新手,但有很多我不熟悉的高级查询技术。
答案 0 :(得分:1)
以下强力方法适用于所有数据库:
select (case when col like '%1%' and col like '%2%' and col like '%3%' then 1
when col like '%2%' and col like '%3%' and col like '%4%' then 1
when col like '%3%' and col like '%4%' and col like '%5%' then 1
when col like '%4%' and col like '%5%' and col like '%6%' then 1
when col like '%5%' and col like '%6%' and col like '%7%' then 1
when col like '%6%' and col like '%7%' and col like '%1%' then 1
when col like '%7%' and col like '%1%' and col like '%2%' then 1
else 0
end) as HasThreeConsecutiveDays
如果连续三天,则返回0/1标志。
答案 1 :(得分:0)
因此,如果传入5,它将查找连续5天标记的任何内容。
如果没有动态的sql,你将无法做到这一点,因为你想支持从7回到1的包装。我可以编写一个查询,如果你没有&#39,你会在一个语句中为你做这个关心从一周末回到开头的包装,但是根据这个要求,我没有看到如何在没有在程序中构建动态sql字符串的情况下这样做,我没有时间现在玩(也许其他人会采取这个想法并与之一起运行)。
现在这个选项失败了,我可以这样做:
WHERE
( col like '1,2,3%'
OR col like '%2,3,4%'
OR col like '%3,4,5%'
OR col like '%4,5,6%'
OR col like '%5,6,7'
OR col like '1%6,7'
OR col like '1,2%7'
)
这应该比检查另一个答案中显示的单个数字更好,因为完成的模式匹配更少。但是,仅在我们能够保证排序顺序时才有效。我们还需要事先知道逗号在数字之间是如何间隔的,但是如果需要,我们可以通过用空字符串替换所有逗号和/或空格来修复该问题(并相应地调整模式)。
还有一个想法:我意识到我可以支持日计数参数,如果你可以管理将某个额外的表偷偷带进某个地方的db。该表看起来像这样:
create Table DayPatterns (Days int, Pattern varchar(13) )
,表格中的数据如下所示:
1 1% 1 %2% 1 %3% ... 2 1,2% 2 %2,3% 2 %3,4% 2 %4,5% ... 2 1%7 ... 3 1,2,3% 3 %2,3,4% ... 3 1%6,7 3 1,2%7 ... 7 1,2,3,4,5,6,7
希望你能明白如何填补这一点。有了这个表,您可以使用如下查询对表进行JOIN:
INNER JOIN DayPatterns p ON p.Days = @ConsecutiveDays AND col LIKE p.Pattern
完成这项工作的关键(除了需要能够在某处创建该表之外)还在正确的列上执行GROUP BY。否则,您最终会遇到与现在相同的问题,其中匹配多个可能的连续日模式将会复制您的结果。
最后,当然你知道大多数包含csv数据的架构都被打破了,但是因为你似乎无法解决这个问题,所以希望其中一个想法会有所帮助。