2

この質問の回答とコメントに続いて、30分スロットのグループ化を機能させようとしましたが、何らかの理由で、分が大きいか小さいかに応じて、行にそれぞれ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時間が 30 分未満か 30 分を超えているかに関係なく、列は実際には 1,2 ではなく、1 から N になりDealます。

何か案は?

4

1 に答える 1

1

これは、そのクエリで SeqNum が 1 または 2 であることを意図していないためです。シーケンス番号は、その 1 または 2 の値に基づいてデータを分割したときの行番号です。これは、mins < 30 のすべての値がセットに分割され、Deal によって並べ替えられ、1 から N までの番号が付けられることを意味します。Deal >= 30 についても同じことが行われます。

やりたいことを行うには、日付、時間、および 1 または 2 の値で分割して、個々の 30 分ごとのレコードがセットに分割され、番号が付けられるようにする必要があります。 30分ごとに最初のレコード。

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 に答える