-1

私はそれらの2つのテーブルを持っています

1 - キュー テーブルに追加

TransID , ADD date 
10 , 10/10/2012
11 , 14/10/2012
11 , 18/11/2012
11 , 25/12/2012
12 , 1/1/2013

2 - キュー テーブルから削除されました

TransID , Removed Date 
10 , 15/1/2013
11 , 12/12/2012
11 , 13/1/2013
11 , 20/1/2013

TansID は 2 つのテーブル間のキーであり、これらのテーブルを変更することはできません。必要なのは、各トランザクションがキューで費やした時間をクエリすることです

各テーブルに 1 つのアイテムがある場合は簡単ですが、アイテムが複数回キューに入れられた場合、どのように計算すればよいでしょうか?

4

3 に答える 3

1

TransID が Add テーブルに入力される順序が削除される順序と同じであると仮定すると、次のように使用できます。

WITH OrderedAdds AS
(   SELECT  TransID,
            AddDate,
            [RowNumber] = ROW_NUMBER() OVER(PARTITION BY TransID ORDER BY AddDate)
    FROM    AddTable
), OrderedRemoves AS
(   SELECT  TransID,
            RemovedDate,
            [RowNumber] = ROW_NUMBER() OVER(PARTITION BY TransID ORDER BY RemovedDate)
    FROM    RemoveTable
)
SELECT  OrderedAdds.TransID,
        OrderedAdds.AddDate,
        OrderedRemoves.RemovedDate,
        [DaysInQueue] = DATEDIFF(DAY, OrderedAdds.AddDate, ISNULL(OrderedRemoves.RemovedDate, CURRENT_TIMESTAMP))
FROM    OrderedAdds
        LEFT JOIN OrderedRemoves
            ON OrderedAdds.TransID = OrderedRemoves.TransID
            AND OrderedAdds.RowNumber = OrderedRemoves.RowNumber;

重要な部分は、各レコードがトランザクション ID と入力された日付に基づいて行番号を取得することです。その後、行番号とトランス ID の両方で結合してクロス結合を停止できます。

SQL Fiddle の例

于 2013-01-21T20:04:15.857 に答える
0

免責事項:これにはおそらく問題がありますが、私はあなたを1つの可能な方向に送りたいと思っています。必ず問題を予期してください。

次の方向で試すことができます(システム、バージョンなどによっては、何らかの方法で機能する可能性があります)。

SELECT transId, (sum(add_date_sum) - sum(remove_date_sum)) / (1000*60*60*24)
FROM
(
    SELECT transId, (SUM(UNIX_TIMESTAMP(add_date)) as add_date_sum, 0 as remove_date_sum
    FROM add_to_queue 
    GROUP BY transId

    UNION ALL

    SELECT transId, 0 as add_date_sum, (SUM(UNIX_TIMESTAMP(remove_date)) as remove_date_sum
    FROM remove_from_queue 
    GROUP BY transId
)
GROUP BY transId;

少し説明します。私が知る限り、日付を合計することはできませんが、ある種のタイムスタンプに変換することはできます。UNIX_TIMESTAMPSが機能するかどうかを確認するか、他のことを考えてください。次に、各テーブルで合計し、もう一方をzetoのままにして、ユニオンクエリを減算することでユニオンを作成できます。

最初のSELECTの最後のその分割については、UNIT_TIMESTAMPがミリ秒をスローし、日数を取得するように工夫します。

これはすべて言った-私はおそらくストアドプロシージャまたはいくつかのクライアントスクリプトを使用してこれを解決するでしょう。SQLはすべての戦いの武器ではありません。2つの別々のクエリを作成する方がはるかに簡単です。

于 2013-01-21T17:15:21.750 に答える
0

回答 2: コメントの後。(補足として、日付の一部は15/1/2013適切13/1/2013な日付形式を表していません)

select transId, sum(numberOfDays) totalQueueTime
from (
    select a.transId,
       datediff(day,a.addDate,isnull(r.removeDate,a.addDate)) numberOfDays
    from AddTable a left join RemoveTable r on a.transId = r.transId
    order by a.transId, a.addDate, r.removeDate
) X
group by transId

回答 1: コメントの前に

削除されない限り、新しいレコードが追加されないと仮定します。また、次のクエリがもたらすことに注意してくださいnumberOfDays as zero for unremoved records

select a.transId, a.addDate, r.removeDate,
       datediff(day,a.addDate,isnull(r.removeDate,a.addDate)) numberOfDays
from AddTable a left join RemoveTable r on a.transId = r.transId
order by a.transId, a.addDate, r.removeDate
于 2013-01-21T16:49:25.797 に答える