0
EquipmentUseId  CollectionPointId  EmployeeNum  ShopOrder  StartDateTime
366                 69             9999         999999     4/26/13 3:29 PM
373                 69             4878         107321     4/26/13 10:19 PM
385                 69             4971         107321     4/27/13 7:35 AM
393                 69             4179         107325     4/30/13 7:24 AM
394                 69             4179         107325     4/30/13 7:38 AM
395                 69             4179         107325     4/30/13 10:28 AM
398                 69             4179         107325     4/30/13 2:41 PM
399                 69             9999         999999     4/30/13 2:43 PM
400                 69             9999         999999     4/30/13 2:46 PM

上記の表を考えると、私には独特の問題が残っており、それを説明するのは難しいかもしれません. Employee ごとの ShopOrder ごとに StartDateTime がありますが、StopDateTime はありません。これは設計によるものです。ただし、ある ShopOrder の StartDateTime と次の ShopOrder の StartDateTime の時間差を計算できる必要があります。例: SO # 999999 は 4/26 の 15:29 に従業員 9999 によって開始され、新しい SO # 107321 は従業員 4878 によって 4/26 の 22:19 に開始されます。4/ の差を計算する必要があります。 2013 年 4 月 26 日 22:19 および 2013 年 4 月 26 日 15:29。これにより、SO# 9999 の退勤日がわかりますが、実際には二次プロセスが必要です。今のところ、私は時間を得ることができる必要があります。問題の 1 つは、SO # が同じ場合、最初の StartDateTime のみを使用することです。および次の SO # の最初の StartDateTime。申し訳ありませんが、これは非常に長く、この時点で何かを説明したかどうかさえわかりません.

ゆっくりしてください...長い一日でした。

2013 年 8 月 19 日の出力用に編集:

週末に熟考した後、このクエリはアプリケーション/レポート全体の最初のステップにすぎないため、EndDateTime を使用するのが最善であると判断しました。

また、EmployeeNum はアプリケーションのこの部分には関係ありません。

これはどのように見えるべきですか (EquipmentUseID は PK で、CollectionPointID は常に 69 なので、出力に表示する必要はありません)。

ShopOrder    StartDateTime        EndDateTime
999999       4/26/13 3:29 PM      4/26/13 10:19 PM
107321       4/26/13 10:19 PM     4/30/13 7:24 AM
107325       4/30/13 7:24 AM      4/30/13 2:43 PM
999999       4/30/13 2:43 PM      <next SO# StartDateTime>

この表を要約するには、SO# 、SO#ごとのStartDateTime (既に表にある)、および実際には次の SO# の StartDateTime である EndDateTime が必要ですこれで問題が解決することを願っています。混乱して申し訳ありません。

4

3 に答える 3

0

CTE を使用 -

;with Equipment as 
(
select EquipmentUseId, CollectionPointId, EmployeeNum, ShopOrder, StartDateTime, row_number() over (PARTITION BY ShopOrder order by EquipmentUseId) as rownumber
from your_table 
),
Equipment2 AS (
select EquipmentUseId, CollectionPointId, EmployeeNum, ShopOrder, StartDateTime, row_number() over (order by EquipmentUseId) as rownumber
from Equipment WHERE rownumber = 1
)

SELECT t1.EquipmentUseId,
   t1.CollectionPointId,
   t1.EmployeeNum,
   t1.ShopOrder,
   t1.StartDateTime,
   CONVERT(VARCHAR, DATEDIFF(n, t1.StartDateTime, t2.StartDateTime) / 60) + ':' +  RIGHT('0' + CONVERT(VARCHAR,(DATEDIFF(n, t1.StartDateTime, t2.StartDateTime)%60)), 2) time_diff
FROM   Equipment2 AS t1
LEFT JOIN Equipment2 AS t2 ON  t2.rownumber = t1.rownumber + 1 
于 2013-08-17T00:08:37.370 に答える
0
with orderedTickets as 
(
    select ShopOrder, min(StartDateTime) as date 
         , row_number() over (order by min(StartDateTime)) as rownumber
    from table 
    where ShopOrder is not null  
    group by ShopOrder
)
select t1.ShopOrder, datediff(ss, t1.StartDateTime, t2.StartDateTime) 
  from orderedTickets as t1 
  join orderedTickets as t2 
    on t2.rownumber = t1.rownumber + 1 
于 2013-08-16T22:58:12.030 に答える
0

これは、「次の」製造オーダーで次の日時を取得するという最初の問題の解決策です。このソリューションでは、相関サブクエリを使用します。

select t.*, nextStartDateTime - StartDateTime -- or use datediff() here if you want the time in particular units
from (select t.*,
             (select top 1 StartDateTime
              from t t2
              where t2.StartDateTime > t.StartDateTime and
                    t2.ShopOrder <> t.ShopOrder
              order by StartDateTime
             ) as nextStartDateTime
      from t
     ) t;

2 番目の問題は、特定の製造オーダーの最初のレコードを取得することです。これを完全に理解しているかどうかはわかりません。質問で提供されたデータで必要な結果を説明するために質問を編集すると役立ちます。

于 2013-08-16T22:30:31.127 に答える