PostgreSQL:使用PARTITION和LIMIT

时间:2018-03-08 17:37:35

标签: sql postgresql

我有以下"队列"表

id | type | started_at   | finished_at
----------------------------------
1  | A    | some_date    | some_date
2  | A    | some_date    | NULL
3  | A    | NULL         | NULL
4  | A    | NULL         | NULL

5  | B    | some_date    | some_date
6  | B    | NULL         | NULL
7  | B    | NULL         | NULL
8  | B    | NULL         | NULL

9  | C    | NULL         | NULL
10 | C    | NULL         | NULL
11 | C    | NULL         | NULL
12 | C    | NULL         | NULL

13 | D    | some_date    | NULL
14 | D    | NULL         | NULL
15 | D    | NULL         | NULL
16 | D    | NULL         | NULL

我想要的是获得下一个要处理的项目。

每种类型最多应同时运行2次。

因为已经有了#34;正在运行"输入A和D类型, 期望的结果看起来像这样。

id | type | started_at   | finished_at
3  | A    | NULL         | NULL

6  | B    | NULL         | NULL
7  | B    | NULL         | NULL

9  | C    | NULL         | NULL
10 | C    | NULL         | NULL

14 | D    | NULL         | NULL

到目前为止我所获得的是每种类型的下两个项目。

WITH TOSTART AS (
    SELECT *, ROW_NUMBER() 
    over (
        PARTITION BY type
        order by id
    ) AS RowNo 
    FROM table_name
    where started_at is null and finished_at is null
)
SELECT id FROM TOSTART WHERE RowNo <= 2 -- max parallel

我需要的是带来&#34;状态&#34;考虑到了。

1 个答案:

答案 0 :(得分:1)

首先应删除所有已完成的条目:

def run() {
  val df1 = getdf1(spark: SparkSession)
  val df2 = getdf2(spark:SparkSession, df1)
}

def getdf1(spark: SparkSession): DataFrame {
  val sqltxt = "select * from emp"
  val df1 = spark.sql(sqltxt)
  df1.persist
  spark.sql("SET spark.sql.hive.convertMetastoreParquet=false")
  df1.write.mode(SaveMode.Overwrite).parquet("/user/user1/emp")
  df1
}

def getdf2(spark: SparkSession, df1: DataFrame): DataFrame {
   // perform some operations
}