使用adventureworks2012 [銷售]。[的SalesOrderHeader]其中第10條是這樣的(復位第一的SalesOrderID的狀態爲客戶11000至0後),其中5等同於成功
+--------------+---------------------+------------+--------+
| salesorderid | orderdate | customerid | status |
+--------------+---------------------+------------+--------+
| 1 | 2009-10-13 00:00:00 | 0 | 0 |
| 43793 | 2005-07-22 00:00:00 | 11000 | 0 |
| 51522 | 2007-07-22 00:00:00 | 11000 | 5 |
| 57418 | 2007-11-04 00:00:00 | 11000 | 5 |
| 43767 | 2005-07-18 00:00:00 | 11001 | 5 |
| 51493 | 2007-07-20 00:00:00 | 11001 | 5 |
| 72773 | 2008-06-12 00:00:00 | 11001 | 5 |
| 43736 | 2005-07-10 00:00:00 | 11002 | 5 |
| 51238 | 2007-07-04 00:00:00 | 11002 | 5 |
| 53237 | 2007-08-27 00:00:00 | 11002 | 5 |
+--------------+---------------------+------------+--------+
10 rows in set (0.18 sec)
的Mysql
select f.customerid,f.firstorder,o2.`Status`,s.secondorder,o3.`status`,
o2.OrderDate, o3.OrderDate, datediff(o3.OrderDate, o2.OrderDate) daysbetweenorders
from
(
select customerid,min(salesorderid) firstorder
from orders
where #customerid = 11000 and
status = 5
group by customerid
) f
join
(
select customerid,min(o.salesorderid) secondorder
from orders o
where #o.customerid = 11000 and
o.salesorderid > (select min(salesorderid) from orders o1 where o1.customerid = o.customerid and o1.Status = 5)
group by customerid
) s on s.customerid = f.customerid
join orders o2 on o2.SalesOrderID = f.firstorder
join orders o3 on o3.SalesOrderID = s.secondorder
limit 10
結果
+------------+------------+--------+-------------+--------+---------------------+---------------------+-------------------+
| customerid | firstorder | Status | secondorder | status | OrderDate | OrderDate | daysbetweenorders |
+------------+------------+--------+-------------+--------+---------------------+---------------------+-------------------+
| 11000 | 51522 | 5 | 57418 | 5 | 2007-07-22 00:00:00 | 2007-11-04 00:00:00 | 105 |
| 11001 | 43767 | 5 | 51493 | 5 | 2005-07-18 00:00:00 | 2007-07-20 00:00:00 | 732 |
| 11002 | 43736 | 5 | 51238 | 5 | 2005-07-10 00:00:00 | 2007-07-04 00:00:00 | 724 |
| 11003 | 43701 | 5 | 51315 | 5 | 2005-07-01 00:00:00 | 2007-07-09 00:00:00 | 738 |
| 11004 | 43810 | 5 | 51595 | 5 | 2005-07-26 00:00:00 | 2007-07-26 00:00:00 | 730 |
| 11005 | 43704 | 5 | 51612 | 5 | 2005-07-02 00:00:00 | 2007-07-27 00:00:00 | 755 |
| 11006 | 43819 | 5 | 51198 | 5 | 2005-07-27 00:00:00 | 2007-07-02 00:00:00 | 705 |
| 11007 | 43743 | 5 | 51581 | 5 | 2005-07-12 00:00:00 | 2007-07-25 00:00:00 | 743 |
| 11008 | 43826 | 5 | 51282 | 5 | 2005-07-28 00:00:00 | 2007-07-07 00:00:00 | 709 |
| 11009 | 43837 | 5 | 51562 | 5 | 2005-07-30 00:00:00 | 2007-07-24 00:00:00 | 724 |
+------------+------------+--------+-------------+--------+---------------------+---------------------+-------------------+
10 rows in set (0.77 sec)
的SQL Server 只非常相似,但狀態需要逃避,DATEDIFF語法是不同的,最高限額替換
select top 10 f.customerid,f.firstorder,o2.[Status],s.secondorder,o3.[status],
o2.OrderDate, o3.OrderDate, datediff(d,o2.OrderDate, o3.OrderDate) daysbetweenorders
from
(
select customerid,min(salesorderid) firstorder
from [Sales].[SalesOrderHeader]
where --customerid = 11000 and
status = 5
group by customerid
) f
join
(
select customerid,min(o.salesorderid) secondorder
from [Sales].[SalesOrderHeader] o
where --o.customerid = 11000 and
o.salesorderid > (select min(salesorderid) from [Sales].[SalesOrderHeader] o1 where o1.customerid = o.customerid and o1.Status = 5)
group by customerid
) s on s.customerid = f.customerid
join [Sales].[SalesOrderHeader] o2 on o2.SalesOrderID = f.firstorder
join [Sales].[SalesOrderHeader] o3 on o3.SalesOrderID = s.secondorder
order by f.customerid
注: - 確保你有適當的鑰匙 - 我看到下面的MySQL(不能保證這些對您的應用程序)。
CREATE TABLE `orders` (
`SalesOrderID` int(11) NOT NULL,
`RevisionNumber` int(11) NOT NULL,
`OrderDate` varchar(50) NOT NULL,
`DueDate` varchar(50) NOT NULL,
`ShipDate` varchar(50) DEFAULT NULL,
`Status` int(11) NOT NULL,
`OnlineOrderFlag` int(11) NOT NULL,
`SalesOrderNumber` int(11) DEFAULT NULL,
`PurchaseOrderNumber` int(11) DEFAULT NULL,
`AccountNumber` int(11) DEFAULT NULL,
`CustomerID` int(11) NOT NULL,
`SalesPersonID` int(11) DEFAULT NULL,
`TerritoryID` int(11) DEFAULT NULL,
`BillToAddressID` int(11) NOT NULL,
`ShipToAddressID` int(11) NOT NULL,
`ShipMethodID` int(11) NOT NULL,
`CreditCardID` int(11) DEFAULT NULL,
`CreditCardApprovalCode` varchar(15) DEFAULT NULL,
`CurrencyRateID` int(11) DEFAULT NULL,
`SubTotal` decimal(10,2) NOT NULL,
`TaxAmt` decimal(10,2) NOT NULL,
`Freight` decimal(10,2) NOT NULL,
`TotalDue` decimal(10,2) DEFAULT NULL,
`Comment` varchar(128) DEFAULT NULL,
`rowguid` varchar(50) DEFAULT NULL,
`ModifiedDate` varchar(50) NOT NULL,
KEY `k001` (`OrderDate`,`SalesOrderID`),
KEY `k1` (`CustomerID`,`SalesOrderID`),
KEY `k2` (`SalesOrderID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
要清楚你不在乎第二順序是成功還是失敗? –
Mysql或sql-server - 解決方案每個都會有所不同? –
1. SQL Server所需的解決方案2.第二順序是成功還是失敗並不重要。 3. First_Order_Date和Second_Order_Date不是直接字段,如何得到它們是問題。 – SqlMind