有人可以帮我解决这个MSSQL任务吗?
我困惑了几天:o(
我们有行显示你在当时的机器状态.-
datetime worker order state break ----------------------------------------------------- 2014-01-20 13:00:00 1458 123456 1 2 2014-01-20 12:00:00 1458 123456 1 1 2014-01-20 11:22:22 1458 123456 1 NULL 2014-01-20 09:35:44 1458 123456 3 NULL 2014-01-20 09:00:22 1458 940266 1 NULL 2014-01-20 08:30:07 1458 940266 5 NULL 2014-01-20 08:15:04 1458 940266 1 NULL 2014-01-20 07:47:38 1458 940266 3 NULL
如果最后一个状态是例如“1”,那么我将通过获取所有行(相应的第一次出现)紧接在此Last行之前具有相同的状态值“1”。(因此)
换句话说,我想得到这一行:
2014-01-20 11:22:22 1458 123456 1 NULL
从这个时候站立状态“1” P.S。:具有特定值的最后一行的num发生可以更多,但也可以只有一个。在这种情况下,我只想到最后一行。
感谢回复。
答案 0 :(得分:1)
您想要识别“1”的序列并找到它开始的最早日期。以下查询执行此操作,并提供以下说明:
select top 1 t.*
from (select t.*,
(row_number() over (partition by worker order by datetime desc) -
row_number() over (partition by worker, state order by datetime desc)
) as diff
from t
) t
where diff = 0
order by datetime asc
这将有点难以解释。 row_number()
为行组分配一个序号,该行由partition by
定义。组内的排序由order by
定义。
这为工人命令,最近获得值为1.然后为每个工人/州订购物品,最近得到的值为1.只有当最后一个状态时差异为0 。最终查询按时间选择第一行。
以下是您的数据的行号和差异:
datetime worker order state break rn rn diff
----------------------------------------------------- worker w/st
2014-01-20 13:00:00 1458 123456 1 2 1 1 0
2014-01-20 12:00:00 1458 123456 1 1 2 2 0
2014-01-20 11:22:22 1458 123456 1 NULL 3 3 0
2014-01-20 09:35:44 1458 123456 3 NULL 4 1 3
2014-01-20 09:00:22 1458 940266 1 NULL 5 4 1
2014-01-20 08:30:07 1458 940266 5 NULL 6 1 5
2014-01-20 08:15:04 1458 940266 1 NULL 7 5 2
2014-01-20 07:47:38 1458 940266 3 NULL 8 2 6
所以where diff = 0
选择前三行。