【问题标题】:Finding records that have a corresponding record some time in the future [closed]查找将来某个时间具有相应记录的记录[关闭]
【发布时间】:2018-01-26 20:04:31
【问题描述】:

我有具有以下布局的记录表(目前是列存储):

id  | person_id | practice_key | order_date
-------------------------------------------
1   | 001       | prac-A       | 1501098844
2   | 001       | prac-A       | 1516996444
...

idperson_id 是 UUID(存储为 CHAR),practice_keyVARCHARorder_date 是存储为 NUMERIC 的纪元秒数,

我只想选择至少六个月后拥有order_dateperson_id

我尝试了以下方法:

SELECT MIN(DATE(FROM_UNIXTIME(order_date))) min_order_date, person_id 
FROM the_table WHERE 
DATE(FROM_UNIXTIME(order_date)) >= 
DATE_ADD(MIN(DATE(FROM_UNIXTIME(order_date))), INTERVAL 6 MONTH);

SELECT MIN(DATE(FROM_UNIXTIME(order_date))) min_order_date, person_id 
FROM the_table WHERE 
DATE(FROM_UNIXTIME(order_date)) >= 
DATE_ADD(MIN(DATE(FROM_UNIXTIME(order_date))), INTERVAL 6 MONTH)
GROUP BY person_id;

但我收到以下错误:[HY000][1111] Invalid use of group function

我正在使用 MemSQL v6.0

【问题讨论】:

标签: mysql sql singlestore


【解决方案1】:

在澄清他的立场后,我会尝试以下。它只是简单地加入桌子,并抓住用户的第一个/最后一个订单。 (您应该直接从persons 表而不是订单加入,以避免重复,并在底部附加GROUP_BY 语句。(附sqlfiddle 显示此工作):

SELECT
  orders.person_id,
  first_order.order_date AS min_order_date,
  last_order.order_date AS max_order_date
FROM `orders`
LEFT JOIN `orders` first_order ON (
    first_order.person_id = orders.person_id 
    AND first_order.order_date = (
        SELECT MIN(order_date)
        FROM `orders`
        WHERE person_id = orders.person_id
    )
)
LEFT JOIN `orders` last_order ON (
    last_order.person_id = orders.person_id 
    AND last_order.order_date = (
        SELECT MAX(order_date)
        FROM `orders`
        WHERE person_id = orders.person_id
    )
)
WHERE FROM_UNIXTIME(last_order.order_date) >= DATE_ADD(FROM_UNIXTIME(first_order.order_date), INTERVAL 6 MONTH)
GROUP BY person_id

【讨论】:

  • 仍然遇到同样的错误Invalid use of group function
  • @daniel0mullins 查看我的更新。 WHERE 子句中不需要 MIN()
  • @daniel0mullins 因为您是按人员 ID 分组的,所以每个用户只会得到 1 个结果,其中包含从现在起 >= 6 个月的最小订单日期。
  • 我仍然不确定这就是我要找的东西。我想返回一个人的订单至少比他们的最早订单日期早六个月的行
  • 哦!一秒钟@daniel0mullins,我会更新我的答案
【解决方案2】:
SELECT DATE(MIN(FROM_UNIXTIME(t2.order_date))), t1.person_id 
FROM the_table t1
INNER JOIN the_table t2 ON t1.person_id=t2.person_id
AND DATE(FROM_UNIXTIME(t1.order_date)) >= DATE_ADD(DATE(FROM_UNIXTIME(t2.order_date)), INTERVAL 6 MONTH)
GROUP BY t1.person_id;

【讨论】:

  • 我不希望订购日期超过六个月。我想在SELECT 子句中选择同一个人的订单日期比订单日期晚 6 个月的行。
  • 我编辑了答案,看看它是否对你有帮助。欢呼
  • 嗯,不服气!!!!!
  • 在你的 SELECT 语句中应该是DATE(MIN(FROM_UNIXTIME(t1.order_date)))
  • 是的,很抱歉,但总体思路已经有了 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多