2つのテーブルがあります:
CREATE TABLE STORE (
ID INTEGER NOT NULL,
MEDICINE_ID INTEGER NOT NULL,
SHIPMENT_ID INTEGER NOT NULL,
PACKAGE_ID INTEGER NOT NULL,
QUANTITY INTEGER NOT NULL);
CREATE TABLE ORDERS (
ID INTEGER NOT NULL,
CLIENT_ID INTEGER NOT NULL,
STORE_ITEM_ID INTEGER NOT NULL,
QUANTITY INTEGER NOT NULL,
ORDERDATE DATE NOT NULL,
STATE INTEGER DEFAULT 1 NOT NULL);
ここでは、フィールドのみを記述し、ジェネレーター、トリガー、キーなどは記述していません。
次のビューでは、日付ごとに最も人気のある薬を選択します。
CREATE VIEW ORDERS_STORE_QTY
AS
SELECT
O1.ORDERDATE,
S1.MEDICINE_ID,
SUM(O1.QUANTITY) AS QTY
FROM ORDERS O1
INNER JOIN STORE S1 ON (S1.ID = O1.STORE_ITEM_ID)
WHERE O1.STATE=5 /* the closed order */
GROUP BY O1.ORDERDATE, MEDICINE_ID
ORDER BY O1.ORDERDATE, SUM(O1.QUANTITY) DESC
次に、ビューとそれ自体の左結合を実行し、条件で要約数量を比較します。
SELECT T1.ORDERDATE, T1.MEDICINE_ID, T1.QTY
FROM ORDERS_STORE_QTY T1
LEFT OUTER JOIN ORDERS_STORE_QTY T2
ON (
T1.ORDERDATE = T2.ORDERDATE
AND
T2.QTY > T1.QTY
)
GROUP BY T1.ORDERDATE, T1.MEDICINE_ID, T1.QTY
HAVING COUNT(T2.MEDICINE_ID) < 5
ORDER BY T1.ORDERDATE, T1.QTY DESC
1日あたりの総量がすべて異なっていれば問題ありませんでした。私の仕事は「最高の」薬を1日5つに制限することですが、繰り返し量があることがあるので、シーケンス0、1、2、3、4の代わりに0、1、2、2、2、3、4
を取得
しました、たとえば
5 。
クエリを変更して(ジェネレーターを使用せず、非正規化も使用しないことをお勧めします)、実際に行数を制限するにはどうすればよいですか?
すべてのコードは純粋なSQLに近く(私はそう願っています)、Firebird2.5用に書かれています。