我有一个用于生产cookie的表,其中每个cookie被分配一个盒号和从烤箱出来的时间(饼干一次一个地从烤箱中出来)。用户在退出烤箱后检查cookie并为每个烤箱分配一个盒号。 (盒子编号只是在一天中递增;每盒只有一种饼干。)我想得到今天的盒子编号列表,按时间排序。但是,在每天的开始时,前一天的最后一个框可能没有完全填满,所以这一天可以从例如框56开始,而不是框1.我不会#39 ;想要在方框56中的当天的前几个cookie与当天晚些时候的潜在盒子56中的cookie错误关联。到目前为止我已经
了SELECT BoxNo, MAX(CookieType) AS CookieType
FROM Cookies
WHERE TimeOutOfOven >= CONVERT(date, GETDATE())
GROUP BY BoxNo
ORDER BY MIN(TimeOutOfOven)
但当然不会在离散时间问题处理相同的箱号。
答案 0 :(得分:2)
SELECT BoxNo, CookieType, TimeOutOfOven
, LAG(BoxNo, 1, 0) OVER (ORDER BY TimeOutOfOven) AS PriorBox
FROM cookie
WHERE PriorBox <> BoxNo
and TimeOutOfOven >= CONVERT(date, GETDATE())
WITH CookiePlus
AS
(
SELECT *
, ROW_NUMBER() OVER (ORDER BY TimeOutOfOven) rn
FROM Cookie
WHERE TimeOutOfOven >= CONVERT(date, GETDATE())
)
select cp1.*
from CookiePlus cp1
left join CookiePlus cp2
on cp2.rn = cp1.rn + 1
where cp2.boxID <> cp1.boxID
or cp2.rn is null
答案 1 :(得分:0)
我猜测所有的Cookie都需要几个小时才会出来。也许这个一般性的想法会成功。
如果盒子的总数大致一致,并且填充盒子的时间大致相同,那么你应该能够将这一天分成三个部分:早上是大数字,下午是大数字,其他的。根据需要调整数字。
SELECT BoxNo, MAX(CookieType) AS CookieType
FROM Cookies
WHERE TimeOutOfOven >= CONVERT(date, GETDATE())
GROUP BY
BoxNo,
CASE
WHEN BoxNo > 30 AND HOUR(TimeOutOfOven) < 12 THEN 1
WHEN BoxNo > 30 AND HOUR(TimeOutOfOven) >= 12 THEN 3
ELSE 2
END
答案 2 :(得分:0)
SplitFlag意味着:当天晚些时候有一个编号较低的盒子吗?如果是,则单独对该框进行分组。
更详细地说,内部查询说:找到在此之后生成的所有cookie(不在同一个框中)的最低框号。由于箱号是单调序列(总是增加值),如果当天晚些时候有一个并且也低于当前箱号,那么这些号码必须重置,而当前的号码是前一天的保留。编号中的差距无关紧要。
select BoxNo, max(CookieType) as CookieType, SplitFlag
from (
select
BoxNo, CookieType,
case when (
select min(BoxNo)
from Cookes as c2
where c2.TimeOutOfOven > c.TimeOutofOven and c2.BoxNo <> c.BoxNo
) < BoxNo then 1 else 0 end as SplitFlag
from Cookies as c
where TimeOutOfOven >= convert(date, getdate())
) as T
group by BoxNo, SplitFlag
order by SplitFlag desc, BoxNo