0

我有一张这样的桌子:

|  Time  |  Cash | Employee |
|----------------|----------|
| 03:30  |  300  | McClane  |
| 03:35  |  400  | Travis   |
| 04:30  |  200  | Travis   |
| 04:53  |  100  | John     |

我需要选择 2 个连续的值:

  • 结果 >= 500(现金)
  • 两者相距不到 1 分钟(时间)
  • 由同一员工

它应该是这样的:

|  Time  |  Cash | Employee | 
|----------------|----------|
| 03:35  |  400  | Travis   |
| 04:30  |  200  | Travis   |

我取得的最接近的事情是这样的:

select time, cash, employee from table where (Cash + Cash) >= 500

select time(now() - interval 1 minute)

这可以给我 - 1 分钟,但我不能使用“时间”字段而不是“现在()”函数。

在此先感谢您的帮助,并对英语不好表示抱歉。

编辑。 大错特错,记录不连续也没关系,我可以先按时间排序。

我需要像这样打印记录:

|  Time  |  Cash | Employee | 
|----------------|----------|
| 03:35  |  400  | Travis   |
| 04:30  |  200  | Travis   |

|  Time  |  Cash | Employee | 
|----------------|----------|
| 05:00  |  300  | John     |
| 05:30  |  300  | John     |

|  Time  |  Cash | Employee | 
|----------------|----------|
| 06:35  |  200  | McClane  |
| 06:37  |  200  | McClane  |
| 06:41  |  200  | McClane  |

感谢大家的回复,我正在尝试你的答案。

4

3 回答 3

0

假设pk表示您的表的 PK 列:

    select s1.pk
         , s2.pk
      from (
                select pk
                     , employee
                     , time
                     , @curRank1 := @curRank1 + 1 AS rank
                  from table t1
                     , (SELECT @curRank1 := 2) r1
              order by t1.time desc
           ) s1
inner join (
                select pk
                     , employee
                     , time
                     , @curRank2 := @curRank2 + 1 AS rank
                  from table t2
                     , (SELECT @curRank2 := 1) r2
              order by t2.time desc
           ) s2
        on (     s2.rank        = s1.rank
             and s2.employee    = s1.employee
           )
     where s1.cash + s2.cash >= 500
       and s1.time - s2.time <  interval 1 minute
         ;
于 2013-04-30T16:12:35.457 回答
0
SELECT tc1.ts, tc1.cash, tc1.employee, 
  TIME_TO_SEC(TIMEDIFF(CONCAT("00:",tc1.ts), CONCAT("00:",tc2.ts))) AS tdiff
FROM time_cash AS tc1 INNER JOIN time_cash tc2 ON tc1.employee = tc2.employee
WHERE tc1.ts <> tc2.ts 
  AND ABS(TIME_TO_SEC(TIMEDIFF(
          CONCAT("00:",tc1.ts), CONCAT("00:",tc2.ts)))) <= 60
  AND tc1.cash+tc2.cash > 500
ORDER BY tc1.ts, tc1.employee;

我为此做了一个sqlfiddle

我不确定这是否是您所需要的。我看到了很多改进这一点的可能性,但现在你可以开始使用它了。

一些问题:

  • 这也将拾取超过 500 名相同员工且相隔不到一分钟的所有行对。这可能不是你想要的
  • 我没有假设表格中的任何顺序 - 因此很难说出 collapsar 要求的连续条目。
于 2013-04-30T16:46:07.473 回答
0

这个想法是您希望在另一个事件发生后的一分钟内将所有事件的现金金额相加。您可以使用连接语法来做到这一点。我认为相关子查询更清晰:

select t.*
from (select t.*,
             (select SUM(cash)
              from t t2
              where t2.employee = t.employee and
                    t2.time >= t.time and
                    t2.time <= t.time + interval 1 minute
             ) as sumcash
      from t
     ) t
where sumcash >= 500

在 MySQL 中这方面的性能可能不是那么好。您可以通过索引来提高性能t(employee, time, cash)

于 2013-04-30T17:55:34.350 回答