2

这个问题的答案和评论之后,我试图让我的半小时时段分组工作,但无论出于何种原因,它都没有将行分别编号为 1 或 2,具体取决于分钟是更大还是更小超过 30。

谁能给我一些关于我哪里出错的线索?

select Deal, Price
from (select md.*,
            row_number() over (partition by case when (datepart(minute, Deal) < 30) then 1 else 2 end
                               order by Deal desc) as seqnum
      from MyData md
      where Product = 'XXXXX' AND
            CAST(Deal AS Date) = '2013-09-04'
     ) md
where seqnum = 1;

seqnum列实际上是从 1 到 N,而不是 1,2,无论是在该Deal字段中的 30 分钟以下还是超过 30 分钟。

有任何想法吗?

4

1 回答 1

1

那是因为 SeqNum 在该查询中并不意味着是 1 或 2。序列号是根据 1 或 2 值对数据进行分区时的行号。这意味着将 mins < 30 的每个值拆分为一组,然后按 Deal 排序,它们从 1 到 N 编号。然后对 Deal >= 30 执行相同操作。

要执行您想做的事情,您应该按日期、小时以及您的 1 或 2 值进行分区,以便将每个半小时的记录分成集合并编号,这样 SeqNum = 1 表示每半小时第一次记录。

尝试将您的 seqnum 更改为:

row_number() over (partition by 
              CAST(Deal AS DATE)
            , DATEPART(HOUR, Deal)
            , case when (datepart(minute, Deal) < 30) then 1 else 2 end
                               order by Deal ASC) 
            as seqnum

为了便于阅读,这里只分成这么多行。

要向您显示序列号在做什么,请尝试运行:

select md.*
    ,CAST(Deal AS DATE) AS [Date]
    ,DATEPART(HOUR, Deal) AS [Hour]
    ,case when (datepart(minute, Deal) < 30) then 1 else 2 END AS [WhichHalf]
    ,row_number() over (partition by 
              CAST(Deal AS DATE)
            , DATEPART(HOUR, Deal)
            , case when (datepart(minute, Deal) < 30) then 1 else 2 end
                               order by Deal ASC) 
            as seqnum
from MyData md
where Product = 'XXXXX' AND
    CAST(Deal AS Date) = '2013-09-04'
ORDER BY Deal

希望你有足够的数据来清楚序列号在那里做什么。(Deal=12:01 的记录可能编号为 SeqNum=1,然后之后的每条记录将编号为 2,3,4...直到超过 12:30,此时它将再次重置为 1)

于 2013-11-08T09:17:48.150 回答