Sql server 2008 对不起,我必须更明确一点,不要把一半的问题记在心里。让我重新开始。当前,您的示例包含作业3的一行,时间在2月之前。您的要求规定了转到New列的百分比。相应的Old值显示为0,我试图为自己澄清为什么在本例中它是0。是否因为源中的单个数据行的日期在2月之前(即
Sql server 2008 对不起,我必须更明确一点,不要把一半的问题记在心里。让我重新开始。当前,您的示例包含作业3的一行,时间在2月之前。您的要求规定了转到New列的百分比。相应的Old值显示为0,我试图为自己澄清为什么在本例中它是0。是否因为源中的单个数据行的日期在2月之前(即,sql-server-2008,Sql Server 2008,对不起,我必须更明确一点,不要把一半的问题记在心里。让我重新开始。当前,您的示例包含作业3的一行,时间在2月之前。您的要求规定了转到New列的百分比。相应的Old值显示为0,我试图为自己澄清为什么在本例中它是0。是否因为源中的单个数据行的日期在2月之前(即规定的期限之前)?还是仅仅因为它是一行,即它没有前置行。。。因此,同样,如果存在一个(另一个)作业3行,日期值早于2013年1月15日(当前作业3行也保留在集合中),则作业3的旧必须保留0,还是需要显示另一行的完成百分比?(我在这里假设,New
对不起,我必须更明确一点,不要把一半的问题记在心里。让我重新开始。当前,您的示例包含作业3的一行,时间在2月之前。您的要求规定了转到
New
列的百分比。相应的Old
值显示为0,我试图为自己澄清为什么在本例中它是0。是否因为源中的单个数据行的日期在2月之前(即规定的期限之前)?还是仅仅因为它是一行,即它没有前置行。。。因此,同样,如果存在一个(另一个)作业3行,日期
值早于2013年1月15日
(当前作业3行也保留在集合中),则作业3的旧
必须保留0
,还是需要显示另一行的完成百分比
?(我在这里假设,New
无论如何仍然是5。)为了节省时间,我当前的解决方案将是Old
(如果前面没有行,则为0,如您当前的示例中所示)@然而,伊恩·普雷斯顿的解决方案仍然是可行的。(我希望Ian收到有关此评论的通知,以提醒其解决方案可能存在的问题。尽管我们双方仍需要您澄清这是否是一个问题。)感谢您的工作。我会在本周初仔细查看它,并让你知道它是如何工作的。我没有把它拆开来找出原因,但它似乎从大约1500个不同的工作表中跳过了大约100个工作。不过,感谢您的帮助。它可能会跳过新的作业,即在报告月份之后首次登录的作业。无论如何,如果你想继续前进,我理解。此外,您接受的解决方案比我的更短/更简单,因此可能更易于维护。即使是这样,你也必须对它感到满意(大概是次要的)。
Job Date Percent_complete
--- ---- ----------------
1 1/5/2013 5
2 1/10/2013 5
2 1/25/2013 15
2 2/15/2013 25
3 2/15/2013 5
1 2/10/2013 10
1 2/23/2013 20
1 2/24/2013 18
4 1/12/2013 40
Job Old New
--- --- ---
1 5 18
2 15 25
3 0 5
4 40 40
with max_percent as
(
select Job
, [Max] = max(Percent_complete)
from jobs
where [Date] between '2/1/2013' and '2/28/2013'
group by Job
),
min_percent as
(
select Job
, [Max] = max(Percent_complete)
from jobs
where [Date] < '2/1/2013'
group by Job
)
select Job = coalesce(mn.Job, mx.Job)
, [Min] = case when mx.Job is not null then mn.[Max] else 0 end
, [Max] = coalesce(mx.[Max], mn.[Max], 0)
from max_percent mx
full join min_percent mn on mx.Job = mn.Job
order by Job
with jobList as
(
select distinct Job from jobs
)
select Job
, [Min] = isnull(case when mx.[Max] is not null then mn.[Max] else 0 end, 0)
, [Max] = coalesce(mx.[Max], mn.[Max], 0)
from jobList jl
outer apply
(
select top 1 [Max] = j.Percent_complete
from jobs j
where [Date] between '2/1/2013' and '2/28/2013'
and jl.Job = j.Job
order by j.[Date] desc
) mx
outer apply
(
select top 1 [Max] = j.Percent_complete
from jobs j
where [Date] < '2/1/2013'
and jl.Job = j.Job
order by j.[Date] desc
) mn
order by jl.Job
with jobList as
(
select distinct Job from jobs
)
select Job
, [Min] = isnull(mn.[Max], 0)
, [Max] = coalesce(mx.[Max], mn.[Max], 0)
from jobList jl
outer apply
(
select top 1 [Max] = j.Percent_complete
from jobs j
where [Date] between '2/1/2013' and '2/28/2013'
and jl.Job = j.Job
order by j.[Date] desc
) mx
outer apply
(
select top 1 [Max] = j.Percent_complete
from jobs j
where [Date] < '2/1/2013'
and jl.Job = j.Job
order by j.[Date] desc
) mn
order by jl.Job
Job Date Percent_complete recency
--- ---- ---------------- -------
1 1/5/2013 5 Old
2 1/10/2013 5 Old
2 1/25/2013 15 Old
2 2/15/2013 25 New
3 1/15/2013 5 New
1 2/10/2013 10 New
1 2/23/2013 20 New
1 2/24/2013 18 New
4 1/12/2013 40 Old
Job Date Percent_complete recency rnk
--- ---- ---------------- ------- ---
1 1/5/2013 5 Old 1
2 1/10/2013 5 Old 2
2 1/25/2013 15 Old 1
2 2/15/2013 25 New 1
3 1/15/2013 5 New 1
1 2/10/2013 10 New 3
1 2/23/2013 20 New 2
1 2/24/2013 18 New 1
4 1/12/2013 40 Old 1
Job Date Percent_complete recency rnk
--- ---- ---------------- ------- ---
1 1/5/2013 5 Old 1
2 1/25/2013 15 Old 1
2 2/15/2013 25 New 1
3 1/15/2013 5 New 1
1 2/24/2013 18 New 1
Job Old New
--- --- ---
1 5 18
2 15 25
3 0 5
WITH partitioned AS (
SELECT
Job,
Date,
Percent_complete,
recency = CASE
WHEN Date >= '20130201' THEN 'NEW'
ELSE 'Old'
END
FROM atable
WHERE Date < '20130301'
)
, ranked AS (
SELECT
Job,
Date,
Percent_complete,
recency,
rnk = ROW_NUMBER() OVER (PARTITION BY Job, recency ORDER BY Date DESC)
FROM partitioned
)
, filtered AS (
SELECT
Job,
Percent_complete,
recency
FROM ranked
WHERE rnk = 1
)
, pivoted AS (
SELECT
Job,
Old = ISNULL(Old, 0),
New = ISNULL(New, Old)
FROM filtered
PIVOT (
MAX(Percent_complete) FOR recency IN (Old, New)
) u
)
SELECT *
FROM pivoted
;