我创建了以下sqlite-DB-table,并使用有关不同频率的信息填充它 我分析的一组图像的像素颜色。我想根据相似的颜色选择图像。 我受到马修·穆勒(http://research.cs.wisc.edu/vision/piximilar/)的一个项目的启发,重新焕发活力 一个相似的网站,我即将改变他建议的搜索模式。
每个图像由100个像素组成,因此列color1 ... color6的总和始终为100。
id int | filename text | color1 int | color2 int | color3 int | color4 int | color5 int | color6 int |
------------------------------------------------------------------------------------------------------
1 | 1.bmp | 23 | 25 | 50 | 0 | 0 | 0 |
2 | 2.bmp | 25 | 12 | 11 | 2 | 37 | 13 |
3 | 3.bmp | 15 | 16 | 17 | 18 | 19 | 15 |
4 | 4.bmp | 0 | 100 | 0 | 0 | 0 | 0 |
...
我正在尝试编写一个SQL查询来选择所有元组
a)其中一列的频率高于某个阈值。 以上DB的示例:threshold = 40 - >选择具有ID 1和4的行。
b)任何列的两个之和超过某个阈值。 以上DB的示例:threshold = 60 - >返回带有ID 1,2和4的行
c)行根据它们与某个元组的“关闭”/“相似”的方式进行排序。 上面的DB示例:«closeness»到id 2是目标: 结果顺序:2,3,1,4
非常感谢您对好的查询a,b和c的建议。 谢谢,Dani
答案 0 :(得分:1)
我认为如果您对表进行规范化,您的查询将更容易编写
files
file_id, filename
1, 1.bmp
2, 2.bmp
file_colors
file_id, color_id, color_value
1, 1, 23
1, 2, 25
1, 3, 50
1, 4, 0
1, 5, 0
a)高于某个值的任何1种颜色
select file_id from file_colors
group by file_id
having count(case when color_value >= 40 then 1 end) > 0
b)任何高于某个值的2种颜色的总和
select distinct file_id from file_colors t1
join file_colors t2 on t1.file_id = t2.file_id
where t1.color_id <> t2.color_id
and t1.color_value + t2.color_value >= 60
c)你没有定义'差异'。下面的查询将其计算为每种颜色的绝对距离之和。
select t1.file_id
from file_colors t1
join file_colors t2 on t2.file_id = 2 and t2.color_id = t1.color_id
group by t1.file_id
order by sum(abs(t1.color_value - t2.color_value))