1

それぞれに一意のアプリケーション ID を持つ複数のアプリケーションがあります。各アプリケーションには、テーブルに格納されているログがあります。日付の差を計算する方法を知りたい例:

    AppID Start           Loggedon   change 
    A1    08/07/2010      08/09/2010 Xchange
    A1    08/07/2010      08/20/2010 Ychange
    A1    08/07/2010      08/30/2010 Zchange
    A2    07/07/2010      07/13/2010 Ychange
    A3    09/07/2010      09/09/2010 Xchange

だから私は値が欲しい

Difference
2   (Difference between the application start date and 1st loggedon date)
11  (difference between 08/20 and 08/09, the prior row because AppID stayed the same)
10  (difference between 08/30 and 08/20, the prior row because AppID stayed the same)
6   (Difference between the application start date and 1st loggedon date)
2   (Difference between the application start date and 1st loggedon date)

私がはっきりしていることを願っています。どうすればこれを達成できますか、Ranking と Row_Number を試しました。でも、どこか間違っているかもしれません。SQL Server を使用していますが、LAG() を使用できません

4

2 に答える 2

1

OK、これでうまくいきます。楽しみ。

今テストしました!ありがとうsgeddes- http: //sqlfiddle.com/#!3/e4d28/19

WITH tableNumbered AS
(
   SELECT *,
      ROW_NUMBER() OVER (PARTITION BY AppID ORDER BY AppID, Start , Loggedon ) AS row
   FROM Apps
)
SELECT t.*,
  CASE WHEN t2.row IS NULL THEN DATEDIFF(day,t.Start,t.LoggedOn)
       ELSE DATEDIFF(day,t2.LoggedOn,t.Loggedon)
  END as diff
FROM tableNumbered t
LEFT JOIN tableNumbered t2 ON t.AppID = t2.AppID AND t2.row+1 = t.row

私はまだあなたがUIでそれをするべきだと思います。

于 2013-02-01T03:45:24.950 に答える
1

@Hoganには正しいアプローチがありますが、何らかの理由で完全に機能させることができません。これは正しい結果を生成するように見えるわずかなバリエーションです-ただし、@ Hoganの答えを受け入れてください:)

WITH cte AS (
  SELECT AppId, Start, LoggedOn, 
  ROW_NUMBER() OVER (ORDER BY AppId) rn
FROM Apps
  ) 
SELECT c.AppId,
  CASE 
    WHEN c2.RN IS NULL
    THEN DATEDIFF(day,c.start,c.Loggedon)
    ELSE
         DATEDIFF(day,c2.Loggedon,c.Loggedon)
    END as TimeWanted
FROM cte c
   LEFT JOIN cte c2 on c.AppId = c2.AppId
      AND c.rn = c2.rn + 1

そして、ここにFiddleがあります。

幸運を。

于 2013-02-01T03:59:48.220 に答える