与えられた2つのテーブル、
、、を
A
含むテーブルcustomerid
lastchange
internallink
B
を含むテーブルinternallink
、turnover
(ここでは単純化して一般的な例に変更していますが、実際の構造はもっと複雑です。今のところSQL方言はmySQLです。)
(テーブルごとの)唯一のユニークなものは内部リンクです。Aには、同じcustomerID、lastchangeの異なる日付、および異なるinternallink値を持つ複数のレコードがあります。これに関連する他のアイテムがあります。テーブルを変更できません。
顧客にとって最新であり(同じcustomerIDを持つすべての中で最も高いlastchange値)、特定の値の条件に一致するBのエントリがリンクされているAのrecordIDが必要です。
私は思います
SELECT `internallink` FROM `B` WHERE (`turnover` > 10000)
一部は問題ではありません。
私はここまで来ました:
SELECT `customerID`, MAX(`lastchange`)
FROM `A`
WHERE `lastchange` IN (SELECT `internallink` FROM `B`
WHERE `turnover` > 10000)
GROUP BY `customerID`;
残念ながら、そのステートメントは間違った結果をもたらします。これは、上記の値が基準を満たさないcustomerIDを返すためですが、一部の古い値はそうしました。これは、最も古い値を選択し、これを返します。ただし、最新のエントリがしきい値を下回っている場合は、customerIDがまったく表示されないようにする必要があります。
私はどこで失敗しましたか、そしてこれへの正しいアプローチは何ですか?
サンプルデータ表A
customerid lastchange internallink 3 2010-02-11 11 3 2010-09-04 12 3 2010-10-22 13 3 2010-11-23 14 4 2010-05-05 15 4 2010-12-01 16 5 2010-11-28 17 5 2010-11-29 18
表B
内部リンクの売上高 11 47000 1211000 13 8000 1415000 1517000 16 23000 17 50000 18 10000
私のテストの実際のしきい値は12000です。最新のエントリがしきい値を下回っているため、customerIDを結果セットに含めるべきではないことがわかります。
結果セットは(3,2010-11-23)(4,2010-12-01)になりますが、現在は(5,2010-11-28)も含まれていますが、これは誤りです。
少し近づいて(あなたの助けを借りて、ありがとう!)、これらの2つのステートメントは両方とも機能します:
SELECT customerID、MAX(lastchange)、internallink FROM A GROUP BY customerID; SELECT internallink FROM B WHERE(turnover> 12000);
今必要なのは、両方の共通部分です...正しいロジックを使用してください!