如何计算 SQLite 中一个句子的序列数?

How to compute the number of sequence on an sentence in SQLite?

我有一个 table 记录了一些产品交付给客户的情况。它的基本方案很简单:

| DeliveryDate | IdClient | IdProduct | Quantity | Cost |

嗯,一个假设是客户一次只能购买一件商品,他们开始购买商品 1,最终他们可能会改变并开始购买商品 2,停止购买商品 1,依此类推。这并不意味着 Item1、Item2、...、ItemN 始终是相同的产品,它们可能会有所不同。

所以,我想要的是能够为每个客户获得购买的不同商品,其初始购买日期,以及每个客户的每个产品的序列号,因为我无法提前猜测是哪个项目将被购买。使用此方案:

| IdClient | IdProduct | FirstTimeDate | NumSequence |

让我用一个例子来解释:

Table:

| 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 句子我可以得到每个客户购买的不同产品的数量:

| 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 创建临时 table,然后我 运行 实际查询):

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

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;

注意:您可以为此使用临时 table。如果是这样,您可以对子查询使用临时 table。如果您在 IdClient, DeliveryDate, IdProduct.

上放置索引,这是个好主意