如何按天获取每个team_id订单的最后两个职位?
position | team_id | day
------------------------------
12 | 1 | 1
21 | 1 | 2
3 | 1 | 3
4 | 1 | 4
31 | 2 | 1
6 | 2 | 2
7 | 2 | 3
21 | 3 | 1
11 | 3 | 2
10 | 3 | 3
我想获得这些行:
3 1
4 1
6 2
7 2
11 3
10 3
我尝试使用JOINS,选择IN(使用team_id作为唯一键),但是我无法识别查询。
答案 0 :(得分:0)
在MySQL 8+中,您可以使用const { dialogflow, BasicCard, Image, Button } = require('actions-on-google');
为按天降序排列的每个团队的每条记录分配编号。
row_number()
在较低版本中,您可以尝试计算比子查询中的当前行年轻的行。如果是最年轻的记录,它将是零,第二个最年轻的记录将是1。但是,这要求日子是唯一的。
SELECT x.team_id,
x.position,
x.day
FROM (SELECT t.team_id,
t.position,
t.day,
row_number() OVER (PARTITION BY team_id
ORDER BY day DESC) rn
FROM elbat t) x
WHERE x.rn IN (1, 2);
答案 1 :(得分:0)
如果您想要最后两天-每个团队都有两天的时间-您可以这样做:
select t.*
from t
where t.day >= (select t2.day
from t t2
where t2.team_id = t.team_id
order by t2.day desc
offset 1 limit 1
);
或者,如果您可以将数据放在一行中,则:
select team_id,
substring_index(group_concat(position order by day desc), ',', 2) as positions
from t
group by team_id;
答案 2 :(得分:0)
检查是否存在具有相同的team_id
但具有较高的day
的两行:
select t.*
from tbl t
where not exists (
select *
from tbl t2
where t2.team_id = t.team_id
and t2.day > t.day
limit 1 offset 1 -- get second row
)
您可以将子查询读取为:“对于同一团队,limit 1 offset 1
比该团队更高的团队没有第二(day
)行。”