如何在列中获得具有相同值的最后一行

时间:2014-01-20 17:18:07

标签: sql sql-server


有人可以帮我解决这个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发生可以更多,但也可以只有一个。在这种情况下,我只想到最后一行。

感谢回复。

1 个答案:

答案 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选择前三行。

相关问题