好的,所以我有一张这样的表:
ID Number State Gender tstamp
==----======----=======----======----===================
1 01 Open Male 2013-04-06 10:27:26
2 01 Open Female 2013-04-07 10:28:23
3 04 Open Male 2013-04-07 11:23:13
4 04 Closed Male 2013-04-07 11:26:45
5 01 Open Male 2013-04-07 12:23:21
5 04 Open Female 2013-04-08 13:27:55
6 04 Open Male 2013-04-08 13:28:53
7 01 Open Female 2013-04-09 13:29:23
8 01 Open Female 2013-04-09 13:30:36
我需要生成一些SQL / PHP来计算每个数字的状态为Open的Male记录。然后我需要检查记录性别是否已经改变,并忽略先前设置的状态。所以如上所述,当记录号01从男性变为女性,再次回到男性,然后再一次回到女性,我需要它忽略旧性别,只计算男性记录,因此它只计算:
6 04 Open Male 2013-04-08 13:27:65
8 01 Open Female 2013-04-09 13:27:65
然后将返回2作为计数。
我无法理解我将如何做到这一点,我尝试了一个循环,检查状态是否相同,性别与最后的记录相同,但我无法做到这一点我想了。我敢肯定,如果有人向我展示解决方案,那么这一切都会突然变得有意义。
我会非常感谢你的帮助!
谢谢!
答案 0 :(得分:1)
如果我理解问题,你需要这样的事情。
SELECT COUNT(*) FROM your_table_name t1 WHERE state='Open' GROUP BY ID ORDER BY tstamp DESC
或者您需要首先在此连接中的两个相同表之间进行连接,您只需要选择1个ID值(按tstamp排序DESC)并计算这些值。
答案 1 :(得分:1)
首先,您需要获取每个号码的最后一条记录。这需要加入:
select t.*
from t join
(select t.number, max(id) as maxid
from t
group by t.number
) tmax
on t.id = tmax.maxid
然后,不是选择所有记录,而是进行所需的计数:
select t.number, sum(case when gender = 'male' and state = 'open' then 1 else 0 end) as NumMales
from t join
(select t.number, max(id) as maxid
from t
group by t.number
) tmax
on t.id = tmax.maxid
group by t.number
您可能还要求每个数字都写一个0/1标记,表示是否存在男性/开放记录。为此,您可以:
select t.number, max(case when gender = 'male' and state = 'open' then 1 else 0 end)
from t
group by t.number