如何获取具有必须不同条件的数据?

How to get data with a must different conditions?

如果我有具有以下结构的表:

用户: USERID,NAME

TIMETB : CHECKTIME,Sysdate,modified,USERID


如果我有这样的示例数据:

用户:

   USERID    NAME
    434      moh
    77       john
    66       yara

TIMETB :

CHECKTIME              USERID  modified
2015-12-21 07:20:00.000  434      0
2015-12-21 08:39:00.000  434      2
2015-12-22 07:31:00.000  434      0
2015-12-21 06:55:00.000  77       0
2015-12-21 07:39:00.000  77       0
2015-12-25 07:11:00.000  66       0
2015-12-25 07:22:00.000  66       0
2015-12-25 07:50:00.000  66       2
2015-12-26 07:40:00.000  66       2
2015-12-26 07:21:00.000  66       2

现在我想获得在同一日期有 two or more different 个交易(已修改)的用户:

我期望的结果是:

CHECKTIME               USERID  modified  NAME
2015-12-21 07:20:00.000  434      0       moh
2015-12-21 08:39:00.000  434      2       moh
2015-12-25 07:11:00.000  66       0       yara
2015-12-25 07:22:00.000  66       0       yara
2015-12-25 07:50:00.000  66       2       yara

我写了以下查询,但我得到的比我预期的要多我的意思是我得到的用户有相同的交易(修改)!!

SELECT a.CHECKTIME,
       a.Sysdate,
       (CASE WHEN a.modified = 0 THEN 'ADD' ELSE 'DELETE' END) AS modified,
       b.BADGENUMBER,
       b.name,
       a.Emp_num AS Creator
FROM TIMETB a
INNER JOIN Users b ON a.USERID = b.USERID
WHERE YEAR(checktime) = 2015
    AND MONTH(checktime) = 12
    AND (
        SELECT COUNT(*)
        FROM TIMETB cc
        WHERE cc.USERID = a.USERID
            AND CONVERT(DATE, cc.CHECKTIME) = CONVERT(DATE, a.CHECKTIME)
            AND cc.modified IN (0, 2)
    ) >= 2
    AND a.modified IS NOT NULL
    AND a.Emp_num IS NOT NULL

您为此使用了 window 个函数:

select t.*
from (select t.*,
             count(*) over (partition by userid, cast(checktime as date)) as cnt
      from timetb t
     ) t
where cnt >= 2;

如果你想要名字,就加入合适的table。

编辑:

如果你想要一个列的不同值,一个简单的方法是比较最小值和最大值:

select t.*
from (select t.*,
             min(modified) over (partition by userid, cast(checktime as date)) as minm,
             max(modified) over (partition by userid, cast(checktime as date)) as maxm
      from timetb t
     ) t
where minm <> maxm;