Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算SQLite中句子的顺序数?_Sql_Sqlite_Sequences - Fatal编程技术网

如何计算SQLite中句子的顺序数?

如何计算SQLite中句子的顺序数?,sql,sqlite,sequences,Sql,Sqlite,Sequences,我有一个表格记录了一些产品交付给客户的情况。其基本方案非常简单: | DeliveryDate | IdClient | IdProduct | Quantity | Cost | 好的,一个假设是客户一次只能购买一个项目,他们开始购买项目1,最终他们可以改变并开始购买项目2,停止购买项目1,等等。这并不意味着Item1,Item2,…,ItemN总是相同的产品,它们可能会有所不同 因此,我想要的是能够为每个客户购买不同的商品,包括其初始购买日期,以及每个客户的每个产品的序列号,因为我无法提前

我有一个表格记录了一些产品交付给客户的情况。其基本方案非常简单:

| DeliveryDate | IdClient | IdProduct | Quantity | Cost |
好的,一个假设是客户一次只能购买一个项目,他们开始购买项目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 |
我可以设法获得所有信息,除了序列号,而不是序列号,通过下面写的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,创建一个临时表,然后运行实际查询:

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

注意:您可以为此使用临时表。如果是这样,您可以使用子查询的临时表。如果您在IdClient、DeliveryDate、IdProduct上添加索引,这是一个好主意。

谢谢!它工作得很好!!非常感谢你。您说过SQLite没有一些功能可以用于此目的。如果我们说的是MySQL o SQL SERVER,我怎么能像您说的那样使用它呢谢谢你Partharaj,你是对的,我写得不太清楚。