1

クエリが結果をやや裏返しの順序で返すようにしたいと考えています。私は顧客の注文のテーブルを持っており、N 個の最も古い注文を取得して処理したいと考えていますが、そのような場合は、処理されるさまざまな顧客の数を最大化する必要がありました。並べ替え順序は、通常は隣同士にあるものを可能な限り分散させるものであるため、「逆順」と表現しています。

CREATE TABLE custorders (
  order_id integer PRIMARY KEY,
  customer,
  data
);

INSERT INTO custorders VALUES 
  (1,'joe','xyz'),
  (2,'joe','abc'),
  (3,'joe','def'),
  (4,'sam','qwe'),
  (5,'sam','rty');

次のような方法で、顧客ごとに最も古い注文を1つ取得できます

SELECT * 
FROM custorders
WHERE order_id IN 
(
 SELECT MIN(order_id) FROM custorders GROUP BY customer
);

しかし、顧客ごとに 2 つの最も古い注文、または (私が本当に必要としている) 異なる顧客の数を最大化するすべての顧客にわたって最も古い 10 の注文を取得しようとして立ち往生しています。つまり、顧客が 20 人いる場合、10 人の異なる顧客が得られますが、複数の保留中の注文を持つ顧客が 8 人しかいない場合、結果には 2 人の顧客が複数回表示されます。

私は sqlite 3 で作業しているため、他のデータベースに固有の関数を使用したソリューションは役に立ちません。

4

4 に答える 4

0

このようなことを試してください。ただし、テストはしていません。ロジックは、order_idの値が小さい2つのレコードのみを選択することです。ここで、MIN()は1つの値のみを返します。

 SELECT * FROM custorders
    WHERE order_id IN 
    (
    SELECT order_id FROM custorders GROUP BY customer
    ORDER BY order_id ASC
    LIMIT 2
    )
    ;
于 2012-08-01T23:34:54.577 に答える
0

SQLlite は TOP キーワードをサポートしていないようです。顧客ごとにグループ化されたサブクエリで 10 を制限すると、顧客ごとの上位 10 人ではなく、10 人の顧客が得られる可能性があります。

自分でトップを実装...

私はここで mysql ソリューションを適応させているので、これをクリーンアップしたい sqllite の経験がある人なら誰でも自由に感じてください。次のようなものが機能するはずです。

order_id をマッピングして、顧客ごとに連続した値を持つようにする必要があります。顧客によって自動的に並べ替えられた行 ID を割り当て、次に顧客の order_id を昇順で割り当てて、最も古いものを最初に取得します。rowid は、主キーを使用しない場合に割り当てられる隠しフィールドです。

CREATE TEMP TABLE temp(
  order_id INTEGER,
  customer text,
  data text
) AS SELECT * FROM custorders ORDER BY customer, order_id ASC;

これで、各顧客の最初の 10 個が何であるかを判断するためにキーオフする行 ID ができました

SELECT t1.* FROM temp AS t1 JOIN (
  SELECT customer, MIN(rowid) AS min FROM temp GROUP BY customer
) AS t2 ON t2.min + 10 < t1.rowid AND t2.customer = t1.customer;
于 2013-10-04T18:30:53.017 に答える
0

できません。SQL はこれを行うことができません。

一般に、SQL には複数の行間でデータを比較する機能はなく、行内でのみ比較できます。

行全体でデータを照合しようとしています(最も古い2つなど)。

などのトリックを試すことはできますが(すべてのレコードが他のレコードよりも大きい場所min(order_id) + 2を見つけます)、それらは拡張可能ではありません。minmin

ごめん。

PS。sqllite にはこのための特別な機能があるかもしれませんが、私はそれに慣れていません。私の答えは、一般的な SQL に対するものです。

于 2012-08-01T23:30:02.580 に答える
0

序文: これはテストされていません (申し訳ありませんが、このラップトップは sqlfiddle でボールをプレーしていませんでした) が、これはうまくいくと思います:

select 
    out.customer,
    group_concat(
        select 
            a.order_id 
        from 
            custOrders a 
        where 
            a.customer=out.customer 
        order by 
            order_id asc 
        limit 2
    ) as outStanding
from
    custOrders out
limit 10
于 2012-08-02T00:09:40.253 に答える