2017-06-09 5 views
1

ここにテーブルihaveがあります。同じテーブルを左結合とグループ分で分けて試してみました。私はそれほど成功しませんでした。SAP HANA:2つの注文の日数

Customer|Order|Date 
    1 | 1 |Date1 
    1 | 2 |Date2 
    1 | 3 |Date3 
    1 | 4 |Date4 
    2 | 1 |Date1 
    2 | 2 |Date3 
    2 | 3 |Date6 
    3 | 1 |Date3 
    3 | 2 |Date5 

必須です:

Customer|Order|Date |diff 
    1 | 1 |Date1| 0 
    1 | 2 |Date2| days_betwen(Date2, Date1) 
    1 | 3 |Date3| days_betwen(Date3, Date2) 
    1 | 4 |Date4| days_betwen(Date4, Date3) 
    2 | 1 |Date1| 0 
    2 | 2 |Date3| days_betwen(Date3, Date1) 
    2 | 3 |Date6| days_betwen(Date6, Date3) 
    3 | 1 |Date3| 0 
    3 | 2 |Date5| days_betwen(Date5, Date3) 

私はロジック部との提案が必要です!

EDIT:注文番号が連続していない場合はどうなりますか?

+2

参照:[私は非常に単純なSQLクエリと思われるものに対してMCVEを提供するのはなぜですか?](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an -mcve-for-what-to-me-to-be-a-very-simple-sql-query) – Strawberry

+0

@Strawberryありがとう!私は次の病棟の質問から3つのステップに従います。 – Sai

+0

私は非常に、すぐに恐れることを恐れている – Strawberry

答えて

1

最初に、CustomerOrderフィールドでテーブルに参加する必要があります。次に、DATEDIFF()関数を使用して、2つの日付間の日数を取得します。 Order列が順番に番号付けされていないが、次のOrder値が前回よりも大きい場合

SELECT 
    cur.`Customer` AS `Customer`, 
    cur.`Order` AS `Order`, 
    cur.`Date` AS `Date`, 
    DATEDIFF(cur.`Date`, IFNULL(prv.`Date`, cur.`Date`)) AS `DaysPassed` 
FROM 
    MyTable cur 
    LEFT JOIN 
    MyTable prv 
    ON cur.`Customer` = prv.`Customer` AND cur.`Order` = prv.`Order`+ 1; 
  • 、あなたはを使用することができます。Order列が順番に番号が付けられ

    1. 場合、ソリューションは、最も単純ですまたはより小さい演算子。 GROUP BY句と集合関数を使用して、各注文の単一行を返します。注意してください、多分それは長くなるでしょう!あなたは、ランダムな順序番号を使用する場合

      SELECT 
          comb.`Customer` AS `Customer`, 
          comb.`curOrder` AS `Order`, 
          comb.`curDate` AS `Date`, 
          DATEDIFF(comb.`curDate`, IFNULL(pr.`Date`, comb.`curDate`)) AS `DaysPassed` 
      FROM 
          (SELECT 
           cur.`Customer` AS `Customer`, cur.`Order` AS curOrder, cur.`curDate` AS `Date`, max(prv.`Order`) AS `prvOrder` 
          FROM 
           MyTable cur 
           LEFT JOIN 
           MyTable prv 
           ON cur.`Customer` = prv.`Customer` AND cur.`Order` > prv.`Order` 
           GROUP BY cur.`Order`, cur.`Customer`) comb 
          LEFT JOIN 
          MyTable pr 
          ON pr.`Customer` = comb.`Customer` AND pr.`Order` = comb.prvOrder; 
      
    2. 、同じ顧客の最寄りの注文日によってレコードを結合するためにcombサブクエリでDate列の代わりOrderを使用することが可能です。

    幸運を祈る!

  • +0

    それは非常に賢いときれいだった!注文番号が連続していない場合はどうなりますか? – Sai

    +1

    @Sai、それは難しいでしょう!行を索引付けするには、[一時変数](https://stackoverflow.com/a/3127004/7914637)を使用することができます。しかし、私はそれがJOIN節で使用されることは確実ではありません。 – Alexander

    +0

    これはまさに私があなたの非常にスマートな解決策を考えていたことでした。私は月曜日にそれをチェックしなければならない!私は確認した後であなたにメッセージを残します。クールなアイデアをありがとう。 – Sai