ある日付の間隔を再帰的にSQLで算出したいと考えています。


|注文日|顧客名|日付間隔|
|2013-04-23|はてな(株)|0|
|2013-04-30|はてな(株)|7|
|2013-5-12|はてな(株)|12|
|2013-5-16|はてな(株)|4|

このような感じで、注文と注文の間の日付間隔をSQL一発で算出することは可能なのか教えて頂けないでしょうか?

プログラムで算出すれば簡単なんですが、それを書くのもかったるくなったので・・・

よろしくお願い致します。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/02/02 18:00:06
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント100pt

過去質問を見るとphpやwordpressなどを使ってたみたいだから、
MySQLで例を作ってみた。

CREATE TABLE `注文`(`注文日` date,`顧客名` text)
;

INSERT INTO `注文`
VALUES ('2013-04-23','はてな(株)')
    , ('2013-04-30','はてな(株)')
    , ('2013-5-12','はてな(株)')
    , ('2013-5-16','はてな(株)')
;

SELECT a.*
    , COALESCE (
        (
            SELECT DATEDIFF( a.`注文日`, b.`注文日` )
            FROM `注文` b
            WHERE b.`顧客名` = a.`顧客名` AND b.`注文日` < a.`注文日`
            ORDER BY b.`注文日` DESC
            LIMIT 1
        ), 0
    ) `日付間隔`
FROM `注文` a
;

おまけでwindows関数を持っているRDBMS向け

CREATE TEMPORARY TABLE "注文"("注文日" date,"顧客名" text)
;

INSERT INTO "注文"
VALUES ('2013-04-23','はてな(株)')
    , ('2013-04-30','はてな(株)')
    , ('2013-5-12','はてな(株)')
    , ('2013-5-16','はてな(株)')
;

SELECT a.*
    , COALESCE (
        "注文日" - lag( "注文日" ) OVER ( PARTITION BY "顧客名" ORDER BY "注文日" )
        , 0
    ) "`日付間隔"
FROM "注文" a
;
id:gothedistance

大変参考になりました。ありがとうございました。

2014/02/03 18:30:35

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません