1

2 つのテーブルがあり、1 つはトランザクション (日付付き) です。もう 1 つはパーセンテージと、それが有効になったパーセンテージの日付 (00:00:00 と仮定) を示します。このパーセンテージは、新しいパーセンテージが有効になるまで有効です。トランザクションが発生したときに有効だったパーセンテージに参加する必要があります。

transactions_table

event_date     amount
2011-01-01     230
2011-02-18     194
2011-03-22     56
2011-04-30     874

percent_table

effective     percent
2010-12-30    15
2011-03-05    25
2011-04-12    30

私が探している結果は次のとおりです。

event_date     amount     percent
2011-01-01     230        15
2011-02-18     194        15
2011-03-22     56         25
2011-04-30     874        30

私はもう試した:

SELECT t.event_date, t.amount, p.percent 
FROM transactions_table AS t 
LEFT JOIN percent_table AS p ON t.event_date >= p.effective 
ORDER BY `t`.`event_date` DESC LIMIT 0 , 30;

それは私に、一見ランダムなパーセンテージを与えます。ランダムな日付>= p.effectiveだけでなく、最大の日付>= p.effectiveを取得する必要があるように思えます。

私は試した:

SELECT t.event_date, p.percent 
FROM bedic_sixsummits_transactions AS t 
LEFT JOIN bedic_sixsummits_percent AS p ON MAX(t.event_date >= p.effective) 
ORDER BY `t`.`event_date` DESC LIMIT 0 , 30

しかし、MySQL は私の弱々しい試みをただ笑っただけでした。

これどうやってするの?

4

2 に答える 2

1
SELECT t.event_date, t.amount, p.percent
FROM bedic_sixsummits_transactions AS t
LEFT JOIN bedic_sixsummits_percent AS p
ON p.effective = 
   ( SELECT MAX( p2.effective ) FROM bedic_sixsummits_percent AS p2
     WHERE p2.effective <= t.event_date
   )
ORDER BY t.event_date DESC LIMIT 0 , 30
于 2012-06-11T19:52:04.577 に答える
1

さらに単純でサブクエリなし:

SELECT event_date, amount, MAX(_percent) as _percent
FROM transactions_table
LEFT JOIN percent_table p1 ON event_date >= effective
GROUP BY event_date, amount
ORDER BY event_date;

http://sqlfiddle.com/#!3/e8ca3/17/0

関連するビジネスモデルのために可能であることに注意してください。percent_table の他のフィールドを取得したくない場合は、もはや適切ではありません:/

于 2012-06-11T20:25:02.227 に答える