已经有一段时间了,我无法将自己的头围在尝试创建的算法上。 在表中存储了具有不同配置的对象列表。
例如,可以有m种不同类型的配置, A,B,C等
每种配置类型都可以有子类型
Object,Parent Configuration,Configuration,Rank
O1, A, A1, 1
O2, A, A2, 2
O3, A, A3, 3
O4, B, B1, 4
O5, B, B2, 5
O6, B, C1, 6
O7, C, C2, 7
给出一个用户,该用户想要按等级按指定配置顺序排列n个具有任何配置的对象,这样就不会有最大可能的不同对象配置,例如:
如果n == 3,并且配置用户感兴趣的是A1,A2,B1,B2,C1,C2
然后使用普通的sql查询
SELECT *
FROM table
WHERE configuration IN ( a1, a2, b1, b2,
c1, c2 )
ORDER BY rank
LIMIT 3;
然后输出将是对象O1,O2和O3,因为它们的排名最高,但是最佳解决方案是将对象O1,O4,O6返回给每个父配置最高级别的对象,
让我们说,如果在上面的示例中n == 4,则输出为 O1,O4,O6和O2,因为我们用尽了所有不同类型的配置,因此我们再次返回了顶级对象。
有帮助吗?
答案 0 :(得分:0)
在无法访问RANK
和ROW_NUMBER
函数的情况下,您可以尝试以下操作:
SELECT main.Object, main.ParentConfiguration, main.Configuration, main.Rank, COUNT(prev.Object) AS RelativeRank
FROM t AS main
LEFT JOIN t AS prev ON prev.ParentConfiguration = main.ParentConfiguration AND prev.Rank < main.rank AND prev.Configuration IN ('A1', 'A2', 'B1', 'B2', 'C1', 'C2')
WHERE main.Configuration IN ('A1', 'A2', 'B1', 'B2', 'C1', 'C2')
GROUP BY main.Object, main.ParentConfiguration, main.Configuration, main.Rank
HAVING COUNT(prev.Object) < (
SELECT CEILING(3 / COUNT(DISTINCT ParentConfiguration)) -- this is where you specify 3
FROM t
WHERE Configuration IN ('A1', 'A2', 'B1', 'B2', 'C1', 'C2')
)
请注意,如果您在HAVING子查询中指定4
,则它将返回CEILING(4/3)=每组2行,即6行。