这是我的数据,item = 0
之后会有两个item = 10
数据插入,首先,我需要过滤item = 0
SELECT *
FROM `mega_wins` `a`
WHERE `item` != 0
我得到了
我的主要目标是当遇到数据项= 10时,如果支出>则计算接下来的两个数据; 300
SELECT *, IF (`a`.`ITEM` = 10,
(
SELECT SUM(IF(`b`.`expenditure` > 500, 1, 0))
FROM `mega_wins` `b`
WHERE `b`.`id` > `a`.`id`
ORDER BY `b`.`id`
LIMIT 2)
, 0) `megaWin`
FROM `mega_wins` `a`
WHERE `item` != 0
但是限制2似乎失败了,我得到了所有数据的重要性,这个项目更大,如何解决?
答案 0 :(得分:1)
在你的限制根本没有应用的地方,因为你有一个没有分组的聚合...你不能有一个分组,因为子查询将返回多行,这是无效的。您需要做的是在子查询中的位置添加其他逻辑以考虑接下来的两个记录。也就是这样的东西
<l:VerticalLayout class="sapUiSmallMargin" >
<VBox>
<Label text="Floor" />
<Select width="200px" id="floor" change ="handleFloorChange"
items="{/floors}">
<core:Item text="{name}" />
</Select>
</VBox>
<VBox>
<Label text="server-room" />
<Select width="200px" id="serverRoom" change ="handleServerRoomsChange"
items="{/floors/0/serverRooms}">
<core:Item text="{name}" />
</Select>
</VBox>
<VBox>
<Label text="server" />
<Select width="200px" id="server" change ="handleServersChange"
items="{/floors/0/serverRooms/0/servers}">
<core:Item text="{name}" />
</Select>
</VBox>
<VBox>
<Label text="units" />
<Select width="200px" id="unit"
items="{/floors/0/serverRooms/0/servers/0/units}">
<core:Item text="{name}" />
</Select>
</VBox>
</l:VerticalLayout>
注意:这是一个相当糟糕的查询,因为它在表上运行一个相关的子查询,意思是SELECT *,
IF (`a`.`ITEM` = 10,
( SELECT SUM(IF(`b`.`expenditure` > 500, 1, 0))
FROM `mega_wins` `b`
WHERE `b`.`id` > `a`.`id` and `b`.`id` - 2 <= `a`.`id`
ORDER BY `b`.`id`
), 0) `megaWin`
FROM `mega_wins` `a`
WHERE `item` != 0
这可能非常费力。在查询数据库之后,可以在另一种编程语言中执行此操作,这可以在直线时间内完成O(n^2)
答案 1 :(得分:0)
这种情况可能只扫描一次只依赖于顺序递增的ID的表数据,而不一定递增1。
select i id,
max(item) item,
max(income) income,
max(if(item != 0,expenditure,null)) expenditure,
sum(item = 0 and expenditure > 500) megaWin
from(
select id, item, income, expenditure,
case when rn = 0 then @id := id when rn in (1,2) then @id else id end i
from(
select id,
item,
income,
expenditure,
case when item = 10 then @rn := 0 when item = 0 then @rn := @rn + 1 end rn
from mega_wins
join (select @rn := null, @id := null) r
order by id
) q
) q
group by i;