如何计算 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
.
上放置索引,这是个好主意
我有一个 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
.