1

ご覧いただきありがとうございます。

顧客ごとの訪問間隔を最短にしようとしています。以下のコードでは、各訪問間の時間を取得していますが、すべての日付を比較しています。私は最小のマージンを必要とし、他のすべてを取り除く/非表示にします。

select a.account_id, a.transaction_id, b.transaction_date , a.transaction_date,            round(a.transaction_date - b.transaction_date, 0) as Time_between
from time_between_trans a, time_between_trans b
where a.transaction_date > b.transaction_date
and a.account_ID like '717724'
and a.account_id = b.account_id
  • transaction_date の各日付について、trasactions でそれに最も近い日付を見つけます

  • それらは同じ account_id である必要があり、2 番目の日付は最初の日付より後である必要があります

4

1 に答える 1

1

クエリに group by を追加する必要があります。

select a.account_id, a.transaction_id, min(time_between) as min_time_between
from (select a.account_id, a.transaction_id, b.transaction_date, a.transaction_date,
             round(a.transaction_date - b.transaction_date, 0) as Time_between
      from time_between_trans a join
           time_between_trans b
           on a.transaction_date > b.transaction_date and
              a.account_ID ='717724' and
              a.account_id = b.account_id
     ) a
group by a.account_id, a.transaction_id

また、適切な結合構文を使用するように結合構文を修正し、ワイルドカードがないため、「like」を「=」に変更しました。

これを表現する方法は他にもあるかもしれませんが、これは標準 SQL です。質問で使用しているデータベースを指定する必要があります。

Oracle を使用している場合は、次のようにします。

select a.*,
       (case when nextdt - transaction_date) < transaction_date - nextdt
             then nextdt - transaction_date)
             else transaction_date - nextdt
        end) as mintime
from (select a.*,
             lead(transaction_date, 1) over (partition by account_id order by transaction_date) as nexttd,
             lag(transaction_date, 1) over (partition by account_id order by transaction_date) as prevtd
      from time_between_trans a
     ) a

実際には、nexttd と prevtd では NULL を考慮する必要があるため、これは正確ではありません。しかし、考え方は単純です。リード関数とラグ関数を使用すると、前のトランザクションまたはテキスト トランザクションを取得できます。その後、必要に応じて最小値を見つけたり、レコードから必要なその他の情報を取得したりできます。

于 2012-07-30T01:57:09.827 に答える