【问题标题】:SELECT records base on previous records contents (no relationship)根据以前的记录内容选择记录(无关系)
【发布时间】:2010-12-15 14:05:33
【问题描述】:

我有一个表 Events,它有一个 EventId (PK)、Date、EmployeeId (FK) 和 StatusId (FK)。

我需要根据特定员工之前发生的记录标准(按时间顺序)选择记录。我不知道该怎么做,因为没有关系。

我想选择所有事件的计数,按 EmployeeId 分组,其中:

(a) 状态 ID = 1
(b) 该 EmployeeId 的最后一个事件(按时间顺序)的 StatusId 为 9。

请注意,任何事件的先前记录不一定与该员工相关。

*编辑说明我正在使用 SQL Server,并且我按日期按时间顺序引用了上一个事件!

【问题讨论】:

  • 按时间顺序基于日期或 EventID
  • 那你为什么不参考上一行存储parent_id呢?顺便说一句,答案很大程度上取决于您使用什么 DBMS。例如,在 Oracle 中,多亏了分析功能 - 它可以很容易地完成。

标签: sql-server subquery


【解决方案1】:

好吧,你可以做一个子查询,即

SELECT EmployeeID, COUNT(*)
       FROM Events e1
WHERE (SELECT TOP 1 StatusID FROM Events e2 WHERE e1.EmployeeID = e2.EmployeeID ORDER
       BY Date desc) = 9
GROUP BY EmployeeID, COUNT(*)

【讨论】:

    【解决方案2】:
    Events (EventId, Date, EmployeeId, StatusId)
    
    select EmployeeId, count(*) from Events as e1
    where e1.StatusId = 1
          and exists (select e2.EventID from Events as e2 
                     where e2.EmployeeId=e1.EmployeeId and e1.date > e2.date and e2.StatusId = 9 order by e2.date desc limit 1)
    group by EmployeeId
    

    类似的东西

    【讨论】:

    • 如果上一条记录的状态不是 9,这将不起作用。
    • 也许我的问题不清楚,但这是预期的功能。本质上,应用程序的业务规则要求 StatusId = 9 的事件必须紧接在 StatusId = 1 的事件之前,才能算作“成功”事件。然后我需要返回按员工分组的所有“成功”事件的计数。
    猜你喜欢
    • 1970-01-01
    • 2018-01-01
    • 2014-01-07
    • 1970-01-01
    • 2015-11-12
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    相关资源
    最近更新 更多