在此表中,我存储了某些spid的可更改值。
随着时间的流逝,这些值可以更改,并且spid可以获取新值。

现在,我想找出启用特定值的时间。

这是单个spid的数据

uid  spid   propertyvalue   creationdate
--------------------------------------------------
1    3      First name       2010-01-17 22:34:00
37   3      Second name      2010-01-18 01:07:24
38   3      Third name       2010-01-18 01:09:00
39   3      Fourth name      2010-01-18 01:18:16
40   3      Fifth name       2010-01-18 01:20:02


因此,第一个值始于2010年1月18日01:07:24,有效期至2010年1月18日01:01:00。

我已经尝试过以下查询:

SELECT s1 . * ,
       s2.creationdate AS datetwo
  FROM salespointproperty s1
  JOIN salespointproperty s2 ON s1.spid = s2.spid
                            AND s1.creationdate < s2.creationdate


这给了我很多双重记录(其中一些是错误的),并且总是遗漏了新名字(因为它后面没有新的创建日期)
例:

uid spid    propertyvalue    creationdate           datetwo
--------------------------------------------------------------
1   3       First name       2010-01-17 22:34:00    2010-01-18 01:07:24 *
1   3       First name       2010-01-17 22:34:00    2010-01-18 01:09:00
37  3       Second name      2010-01-18 01:07:24    2010-01-18 01:09:00 *
1   3       First name       2010-01-17 22:34:00    2010-01-18 01:18:16
37  3       Second name      2010-01-18 01:07:24    2010-01-18 01:18:16
38  3       Third name       2010-01-18 01:09:00    2010-01-18 01:18:16 *
1   3       First name       2010-01-17 22:34:00    2010-01-18 01:20:02
37  3       Second name      2010-01-18 01:07:24    2010-01-18 01:20:02
38  3       Third name       2010-01-18 01:09:00    2010-01-18 01:20:02
39  3       Fourth name      2010-01-18 01:18:16    2010-01-18 01:20:02 *


仅带有星号的行是正确的。缺少第五个名称。

最佳答案

假设在您的示例中,uid 37在uid 38之前一直有效,uid 38在uid 39之前一直有效,依此类推。

SELECT
  s1.uid,
  s1.spid,
  s1.propertyvalue,
  s1.creationdate,
  MIN(s2.creationdate) AS datetwo
FROM salespointproperty s1
INNER JOIN salespointproperty s2
    ON s1.spid = s2.spid
    AND s1.creationdate < s2.creationdate
GROUP BY
  s1.uid,
  s1.spid,
  s1.propertyvalue,
  s1.creationdate;

关于mysql - 在MySQL查询中确定“有效至”日期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2083294/

10-13 09:20