选择一个组的最大值(一个值除外)

时间:2018-06-20 17:35:49

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

我正在使用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_id之外,我需要due_dates最高的unscheduled_date

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

现在出现了问题:有什么方法可以将这些查询组合为一个?

1 个答案:

答案 0 :(得分:0)

经过一段时间的努力,终于找到了一种将上述两个查询结合起来的方法:

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记录。