我正在尝试编写一个查询来处理如下所示的单个表:
record_id item_id part_id part_length
----------- ------- -------- ------------
1 0 0 123.12
2 0 0 123.09
3 0 1 231.24
4 0 1 239.14
5 1 0 45.91
6 1 0 46.12
7 1 1 62.24
8 1 1 59.40
这基本上是一个表,其中记录了多次记录的某些元素的某些部分的不准确长度测量(不是两次,实际上每个部分都有数百个测量值)。通过一次选择,我想得到这样的结果:
record_id item_id part_id unit part_length_ratio
----------- ------- -------- ----- ----------------
1 0 0 1 123.12 / 231.24
2 0 0 1 123.09 / 239.14
3 0 1 0 231.24 / 123.12
4 0 1 0 239.14 / 123.09
5 1 0 1 45.91 / 62.24
6 1 0 1 46.12 / 59.40
7 1 1 0 62.24 / 45.91
8 1 1 0 59.40 / 46.12
基本上是选择一个项目的每个部分作为单位,并在匹配测量次数的同时计算同一项目的其他部分的长度与该单位的比率。我写了一个脚本来计算这种表,但想用 sql 来完成。如果你不明白这个问题我可以理解:)
for each item i
for each part unit of i
for each part other of i
if unit != other
print i.id other.part_id unit.part_id other.length / unit.length
最佳答案
正如我在评论中所说,表格是无序集合:没有第一或第二行...
...除非您想使用 id
列来显式对行进行排序。
但是,您能否保证每个案例始终有(恰好)两个样本,并且“较低的 ID”始终与第一个样本匹配?这看起来非常脆弱,因为在现实生活中,可能会出现测试执行两次或者测试丢失或“延迟”完成的情况。更不用说对数据库的并发访问。
你不能简单地添加一个“样本编号”列吗?
关于mysql查询计算逻辑行组的笛卡尔积的本地值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18249562/