2017-02-17 14 views
0

私はいくつかの製品の配送を顧客に記録するテーブルを1つ持っています。その基本的な仕組みは非常に簡単です:SQLiteで文のシーケンスの数を計算する方法は?

| DeliveryDate | IdClient | IdProduct | Quantity | Cost | 

まあ、1つの仮定は、アイテム1を買ってから停止し、最終的に彼らは変更とアイテム2を買い始めることができ、クライアントは一度に一つのアイテムを購入することができ、そして、彼らはアイテム1を購入し始めるということです、 等々。これは、Item1、Item2、...、ItemNが常に同じ商品であることを意味するものではなく、異なる可能性があります。

私が望むのは、最初の購入日と各顧客のそれぞれの商品のシーケンス数で、各顧客について購入したさまざまな商品を手に入れることができることです。買うだろう。この方式では:

| IdClient | IdProduct | FirstTimeDate | NumSequence | 

私はサンプルで説明しましょう:

表:

| DeliveryDate | IdClient | IdProduct | Quantity | Cost | 
| 2016-05-01 | 1234 | 9876 | 2 | 1000 | 
| 2016-06-01 | 1234 | 9876 | 1 | 500 | 
| 2016-07-01 | 1234 | 8765 | 2 | 2000 | 
| 2016-08-01 | 1234 | 5432 | 3 | 3500 | 
| 2016-06-01 | 3456 | 5432 | 2 | 1500 | 
| 2016-07-01 | 3456 | 5432 | 1 | 700 | 
| 2016-08-01 | 3456 | 9523 | 2 | 2500 | 

所望の出力:

| IdClient | IdProduct | FirstTimeDate | NumSequence | 
| 1234 | 9876 | 2016-05-01 | 1 | 
| 1234 | 8765 | 2016-07-01 | 2 | 
| 1234 | 5432 | 2016-08-01 | 3 | 
| 3456 | 5432 | 2016-06-01 | 1 | 
| 3456 | 9523 | 2016-08-01 | 2 | 

私は除いて、すべてを取得するために管理することができ順序の数、その代わりに、私はさまざまな製品purcの数を得ることができる下に書かれたSQL文クライアントごとがhased:

| IdClient | IdProduct | FirstTimeDate | NumOfDistinctProducts | 
| 1234 | 9876 | 2016-05-01 | 3 | 
| 1234 | 8765 | 2016-07-01 | 3 | 
| 1234 | 5432 | 2016-08-01 | 3 | 
| 3456 | 5432 | 2016-06-01 | 2 | 
| 3456 | 9523 | 2016-08-01 | 2 | 

とSQL(簡単にするために、私は一時テーブルを作成する最初のSQLを実行し、その後、私は、実際のクエリを実行):

// Query to create the temporary table: 
CREATE TEMPORARY TABLE tmpNewDelivering AS WITH FT_CTE AS (
    SELECT min(Date) ChangeDate,* FROM Deliverings WHERE Deliverings.IdProduct IN (// Actual IdProducts //) 
    GROUP BY IdProduct, IdPatient 
    ORDER BY Deliverings.Date ASC 
) 
SELECT * from FT_CTE; 

// Query I want to improve: 
SELECT case when C.StartDate = tND.ChangeDate then "Start" else "Change" end Type, C.NumProducts NumProducts, tND.* 
FROM tmpNewDelivering tND INNER JOIN (
    SELECT IdClient, count(IdProduct) NumProducts, min(ChangeDate) StartDate 
    FROM tmpNewDelivering 
    GROUP BY IdClient 
    ) C ON tND.IdClient = C.IdClient 
ORDER BY tCN.Fecha DESC 
+0

ありがとうPartharaj、あなたは正しく、私はそれを非常に明確に書かなかった。 – raululm

答えて

1

のSQLiteはありません。これに役立つ機能がいくつかあります。

あなただけの集約を使用して、最初の3つの列を取得:

select IdClient, IdProduct, min(DeliveryDate) as FirstTimeDate 
from IdClient 
group by IdPatient, IdProduct; 

をシーケンスを取得するには、あなたは現在の1日以前に購入した異なる製品の数を取得するには、これを変更することができます。

| NumOfDistinctProducts

select IdClient, IdProduct, min(DeliveryDate) as FirstTimeDate, 
     (select count(distinct d2.IdProduct) 
     from Deliverings d2 
     where d2.IdClient = d.IdClient and 
       d2.DeliveryDate <= d.DeliveryDate 
     ) as NumSequence 
from Deliverings d 
group by IdPatient, IdProduct; 

注:これには一時テーブルを使用できます。その場合は、サブクエリの一時表を使用できます。 IdClient, DeliveryDate, IdProductに索引を付けるとよい考えです。

+0

ありがとう!それは完全に働いた!どうもありがとうございます。あなたは「SQLiteにはこれに役立つ機能はありません」と言っていましたが、MySQLのSQL SERVERについて言えば、どうすれば役に立つかもしれませんか? :) – raululm

関連する問題