我希望有人能用knex.js
有一个表 - “task_history”,它有以下列:
id
,task_id
,duration
,date
,start_time
,finish_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
。
提前谢谢!
答案 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
);