SQL查询按一个列分组(具有可能的重复项)并按时间排序

时间:2015-04-24 15:44:13

标签: sql sql-server sql-server-2008 tsql group-by

我有一个用于生产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)

但当然不会在离散时间问题处理相同的箱号。

3 个答案:

答案 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

http://sqlfiddle.com/#!6/20637/1