从具有相似数据的行中选择一行

时间:2017-12-05 07:38:55

标签: postgresql knex.js

我希望有人能用knex.js

解决我的问题

有一个表 - “task_history”,它有以下列: idtask_iddurationdatestart_timefinish_time

假设我在task_history表中有三行:

row 1 - id(1) task_id(3333), duration(200), date(20171204)
        ,start_time("2017-10-19 21:00:00+11"), finish_time("2017-12-05 00:59:18.943+11")

row 2 - id(2) task_id(3333),  duration(200), date(20171204)
        ,start_time("2017-10-19 21:00:00+11"), finish_time()

row 3 - id(3) task_id(4444), duration(100), date(20171204)
        ,start_time("2017-10-19 21:00:00+11"), finish_time()

如您所见,除了id,finish_time之外,第1行和第2行几乎相同。 第2行的finish_time列的值为“null”。

当我尝试以下查询时,它返回row2和row3。

select * from task_history where date=20171204 and finish_time is null 

但是,这不是我想要的。如果task_id存在于另一行,我也不想获得任何行,但它也有finish_time列的值。

查询应仅返回第3行。 但是第1行和第2行,因为第1行的值为finish_time,而第2行的值为task_id

提前谢谢!

2 个答案:

答案 0 :(得分:1)

试试DISTINCT ON

select  distinct on (task_id) * from task_history 
where date=20171204 
order by tastk_id, finish_time  nulls last;

答案 1 :(得分:1)

  

但是,这不是我想要的。如果是的话,我不想得到任何一行   task_id存在于另一行,但它也有值   finish_time专栏。

我理解这就像

  

选择排除行的所有task行   存在于task_id

行的finished != null

这将SQL

一样
SELECT * FROM task t
WHERE NOT EXISTS (
   SELECT id FROM task -- note the 'id' is not important here, could be '*' also
   WHERE task_id=t.task_id AND finish_time IS NOT NULL
);