Sql 使用子查询比较同一表上的日期

Sql 使用子查询比较同一表上的日期,sql,subquery,Sql,Subquery,我需要获取1/5到30/6之间的最新vip使用奖金后的赢取奖金数据 我的表格如下: VIPCODE TXDATETIME ACTION BONUS 1 2019/04/01 17:24 E 7507 1 2019/05/28 20:00 E 2920 1 2019/05/30 20:00 U -19200 1 2019/06/01 17:45 E 11000 1 2019/06/15

我需要获取1/5到30/6之间的最新vip使用奖金后的赢取奖金数据

我的表格如下:

VIPCODE TXDATETIME      ACTION  BONUS
1       2019/04/01 17:24    E   7507
1       2019/05/28 20:00    E   2920
1       2019/05/30 20:00    U   -19200
1       2019/06/01 17:45    E   11000
1       2019/06/15 17:45    U   -4200
1       2019/06/20 13:30    E   400
2       2019/05/02 19:12    E   2700
2       2019/05/02 19:12    U   -14400
2       2019/05/06 17:30    E   1463
2       2019/06/06 17:30    U   -4400
2       2019/07/20 12:38    E   2010
3       2019/05/18 13:58    E   2955
3       2019/06/17 19:20    E   -9000
3       2019/06/18 20:16    E   1000
3       2019/06/24 16:42    E   2000
甚至尝试了联接表或子查询返回错误: 缺少右括号

我使用了以下sql:

SELECT * FROM VIPPoint v where v.txdatetime between to_date('2019-05-01', 'yyyy-mm-dd') and to_date('2019-06-30', 'yyyy-mm-dd')
and v.txdatetime > (SELECT * FROM VIPPoint d where d.XF_ACTION='U' and d.xf_txdatetime < to_date('2019-06-30', 'yyyy-mm-dd') and v.VIPCODE
=d.VIPCODE and rownum=1 order by d.xf_txdatetime desc)

如何正确获取数据?

您可以试试这个。在传递*与datetime进行比较时,内部子查询中存在问题。您应该在内部查询中提到一个列名,以便与中的进行比较


你可以试试这个。在传递*与datetime进行比较时,内部子查询中存在问题。您应该在内部查询中提到一个列名,以便与中的进行比较

试试这个

SELECT * FROM VIPPoint v WHERE CONVERT(DATE,v.TXDATETIME) BETWEEN 
CONVERT(DATE, '2019-05-01') AND CONVERT(DATE, '2019-06-30') AND v.ACTION = 'E' 
AND v.TXDATETIME > (SELECT MAX(TXDATETIME) FROM VIPPoint vp 
WHERE CONVERT(DATE,vp.TXDATETIME) BETWEEN CONVERT(DATE, '2019-05-01') 
AND CONVERT(DATE, '2019-06-30') AND vp.ACTION = 'U'AND vp.VIPCODE = v.VIPCODE)
试试这个

SELECT * FROM VIPPoint v WHERE CONVERT(DATE,v.TXDATETIME) BETWEEN 
CONVERT(DATE, '2019-05-01') AND CONVERT(DATE, '2019-06-30') AND v.ACTION = 'E' 
AND v.TXDATETIME > (SELECT MAX(TXDATETIME) FROM VIPPoint vp 
WHERE CONVERT(DATE,vp.TXDATETIME) BETWEEN CONVERT(DATE, '2019-05-01') 
AND CONVERT(DATE, '2019-06-30') AND vp.ACTION = 'U'AND vp.VIPCODE = v.VIPCODE)
使用窗口功能:

SELECT *
FROM (SELECT v.*,
             MAX(CASE WHEN v.XF_ACTION = 'U' THEN v.txdatetime END) OVER (PARTITION BY VIPCODE) as max_u_date
      FROM VIPPoint v 
      WHERE v.txdatetime >= DATE '2019-05-01' AND
            v.txdatetime < DATE '2019-07-01'
     ) v
WHERE XF_ACTION = 'E' AND
      txdatetime > max_u_date;
注:

日期关键字可能不是必需的。大多数数据库理解YYYY-MM-DD格式的常量。 不要使用日期/时间之间-时间组件可能会弄乱比较。>=/使用窗口功能:

SELECT *
FROM (SELECT v.*,
             MAX(CASE WHEN v.XF_ACTION = 'U' THEN v.txdatetime END) OVER (PARTITION BY VIPCODE) as max_u_date
      FROM VIPPoint v 
      WHERE v.txdatetime >= DATE '2019-05-01' AND
            v.txdatetime < DATE '2019-07-01'
     ) v
WHERE XF_ACTION = 'E' AND
      txdatetime > max_u_date;
注:

日期关键字可能不是必需的。大多数数据库理解YYYY-MM-DD格式的常量。
不要使用日期/时间之间-时间组件可能会弄乱比较。>=/您的子查询将失败,应该匹配1个字段。这些数据3 2019/05/18 13:58 E 2955和3 2019/06/17 19:20 E-9000是否也被考虑在输出中?您可以用小提琴来回应您的错误,这也有助于我们理解您的prblm。@singwong。用你正在使用的数据库标记你的问题。最后,我用几个步骤来解决这个问题:1。将数据克隆到临时表2。选择具有最新操作日期的每个vipcode='U'。3.删除