【问题标题】:SELECT MAX of a group except one valueSELECT MAX 除一个值之外的组
【发布时间】:2018-11-29 22:18:40
【问题描述】:

我正在研究 Spark SQL,我正在尝试使用以下查询获取记录:

/*Select all open tasks which are not unscheduled*/
Dataset<Row> scheduledOpenTasks = sqlContext.sql(
   "SELECT * "
   + "FROM OpenTaskTable "
   + "WHERE due_date < cast('" + unscheduledDate + "' as timestamp)");

scheduledOpenTasks.createOrReplaceTempView("ScheduledOpenTaskTable");

/*Select scheduled tasks with max due_date for each csg_order_id*/
Dataset<Row> scheduledTasks = sqlContext.sql(
   "SELECT TS1.* from ScheduledOpenTaskTable AS TS1 "
   + "INNER JOIN "
   + "   (SELECT csg_order_id, MAX(due_date) AS MaxDD"
   + "   FROM ScheduledOpenTaskTable"
   + "   GROUP BY csg_order_id) AS TS2 "
   + "ON TS1.csg_order_id = TS2.csg_order_id AND TS1.due_date = TS2.MaxDD");

未计划的 _date 的值为 4444-12-30

OpenTaskTable中,每个csg_order_id可以有多个due_date,包括unscheduled_date。我需要csg_order_ids 对应最高的due_dates 除了unscheduled_date

现在,通过第一次查询,我将删除所有具有due_dateunscheduled_date 的记录。在第二个查询中,我正在为每个 csg_order_id 检索最大 due_date 的所有记录。

现在问题来了:有没有办法将这些查询合并为一个?

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。

标签: java sql apache-spark apache-spark-sql


【解决方案1】:

嗯,折腾了一阵子,终于找到了将上面两个查询组合成这样的方法:

sqlContext.sql("SELECT OT1.* from OpenTaskTable AS OT1 INNER JOIN "
+ "(SELECT OT2.csg_order_id, MAX(OT2.due_date) AS MaxDD FROM  "
+ "(SELECT csg_order_id, due_date from OpenTaskTable WHERE due_date < cast('"+unscheduledDate+"' as timestamp)) AS OT2 "
+ "GROUP BY OT2.csg_order_id) AS OT3 "
+ "ON OT1.csg_order_id = OT3.csg_order_id AND OT1.due_date = OT3.MaxDD");

说明: 以前,在第一个查询中,我从 OpenTaskTable 检索数据,然后将其提供给第二个查询。从逻辑上讲,在第二个查询中,我只是对检索到的数据应用了更多过滤器。最后,我们试图只从 OpenTaskTable 中获取所有属性。

因此,对于这个解决方案,我只是使用第一个查询作为最里面的查询,然后在按 csg_order_id 分组的记录上选择 MAX。而且,对于最外层的查询,只是执行了一次内连接以从 OpenTaskTable 中获取所有匹配的 csg_order_id 记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2013-02-11
    相关资源
    最近更新 更多