|
|
谜题 59 解答得很巧妙。
joe celko在 《thinking in set》(sql沉思录)里提到另一个解法也很巧妙:
select task_id, min_start_date,max(end_date)
from (
select task_id
, start_date
, max( case when start_date > max_end_date then start_date end) ---这一步找到离自己最近的broken
over ( partition by task_id order by start_date,end_date
rows between unbounded preceding and current row ) as min_start_date
,end_date from (
select task_id
,start_date
,end_date
,coalesce(max(end_date)
over ( partition by task_id order by start_date,end_date
rows between unbounded preceding and 1 preceding )
, start_date -2 days) as max_end_date
from timesheets ) )
group by task_id,min_start_date
谜题 27 我想到一个SQL可以减少表的关联,
貌似结果也是对的:
WITH T(SNO,PNO,CNT)
AS (SELECT SUPPARTS.*,
COUNT(PNO)
OVER(PARTITION BY SNO ) AS CNT
FROM SUPPARTS)
SELECT A.SNO,
B.SNO
FROM T A,
T B
WHERE A.PNO = B.PNO
AND A.SNO < B.SNO
AND A.CNT = B.CNT
GROUP BY A.SNO,B.SNO
HAVING COUNT(* ) = MAX(A.CNT); |
|