0

好的,所以我有一个这样的表:

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 的男性记录。然后我需要检查记录的性别之前是否已更改并忽略之前设置的状态。所以如上所述,当记录号 01 从男性变为女性,再次变回男性,然后再次变回女性时,我需要它忽略旧的性别,只计算男性记录,所以它只会计算:

6     04        Open       Male      2013-04-08 13:27:65
8     01        Open       Female    2013-04-09 13:27:65

然后将返回 2 作为计数。

我不知道该怎么做,我尝试了一个 while 循环来检查状态是否相同,性别是否与最后的记录相同,但我无法让它做我想做的事。我敢肯定,如果有人向我展示了解决方案,那么这一切都会突然变得有意义。

我会非常感谢一些帮助!

谢谢!

4

2 回答 2

1

如果我能很好地理解问题,你需要这样的东西。

SELECT COUNT(*) FROM your_table_name t1  WHERE state='Open' GROUP BY ID ORDER BY tstamp DESC

或者您需要首先在此连接中的两个相同表之间进行连接,您只需选择 1 个 ID 值(按 tstamp 排序 DESC)并计算这些值。

于 2013-04-08T11:34:14.083 回答
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
于 2013-04-08T12:46:21.417 回答