2017-02-17 7 views
0

У меня есть одна таблица, которая записывает доставку некоторых продуктов клиентам. Его принципиальная схема очень проста:Как вычислить количество последовательностей в предложении в SQLite?

| DeliveryDate | IdClient | IdProduct | Quantity | Cost | 

Ну, один предположение о том, что клиенты могут приобрести только один пункт в то время, и они начинают закупать ITEM1, в конце концов, они могут изменить и начать покупать ITEM2, останавливая от покупки ITEM1 , и так далее. Это не означает 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 | 

мне удалось получить все, кроме число последовательности, вместо этого, с предложением sql, написанным ниже, я могу получить количество разных продуктов purc 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, создавая временную таблицу, и после этого я бегу фактический запрос):

// 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

Спасибо, Партхадж, вы были правы, я не написал это очень ясно. – raululm

ответ

1

SQLite не имеет некоторые возможности, которые были бы полезны для этого.

Вам получить первые три колонки только с помощью агрегации:

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

Чтобы получить последовательность, вы можете изменить это, чтобы получить количество различных продуктов, купленных или перед текущим:

| 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 o SQL SERVER, как я мог бы сделать так, как вы говорите, что это может быть полезно? :) – raululm