SQL如何从另一个select链接最低的行
我从一个星期以来一直在寻找这个问题。我尝试了许多代码,但无法得到正确答案,问题是: 我有一个卖家表,每次客户联系这个卖家时,如果他卖了什么或没有 表卖方我将把一个卖方的数据只给你一个更具体的问题 SellerID-phonecalldate-Sequence-Selling Bool 100 - 2018-01-05 - 1 - 0 100 - 2018-01-05 - 2 - 0 100 - 2018-01-05 - 3 - 1 100 - 2018-01-05 - 4 - 0 100 - 2018-01-05 - 5 - 0 100 - 2018-01-10 - 1 - 0 100 - 2018-01-10 - 2 - 0 100 - 2018-01-10 - 3 - 0 100 - 2018-01-10 - 4 - 1 100 - 2018-01-10 - 5 - 0 100 - 2018-01-10 - 6 - 0 100 - 2018-01-10 - 7 - 0 100 - 2018-01-10 - 8 - 0 100 - 2018-01-10 - 9 - 0 100 - 2018-01-10 - 10 - 0 我想问:他有多少次在打电话的间隙没有卖出。 在模型3中,我应该有一个答案:SQL如何从另一个select链接最低的行,sql,sql-server,select,group-by,Sql,Sql Server,Select,Group By,我从一个星期以来一直在寻找这个问题。我尝试了许多代码,但无法得到正确答案,问题是: 我有一个卖家表,每次客户联系这个卖家时,如果他卖了什么或没有 表卖方我将把一个卖方的数据只给你一个更具体的问题 SellerID-phonecalldate-Sequence-Selling Bool 100 - 2018-01-05 - 1 - 0 100 - 2018-01-05 - 2 - 0 100 - 20
1- a sequence of 2 during 2018-01-05 sequence 1 to 2018-01-05 sequence 2
2- a sequence of 5 during 2018-01-05 sequence 4 to 2018-01-10 sequence 3
2- a sequence of 6 during 2018-01-10 sequence 5 to 2018-01-10 sequence 10
我现在所做的是:我尝试查找边界并获得这两个边界之间的计数我知道数据库从2018-01-05开始,所以我使用2018-01-01作为最低边界的最低日期,在左侧连接中,我使用getdate+1将明天的日期作为最高边界:
Select '2018-01-01' as Date1, SellerID as Seller1, 0 as Sequence1 from Seller Group by Seller
Union ALL
Select phonecalldate as Date1, SellerID as Seller1, 0 as Sequence1 from Seller Where Selling = 'true' group by phonecalldate , SellerID , Sequence
) as Boundary1
Left JOIN (
Select * from (
Select getdate()+1 as Date2, SellerID as Seller2, 0 as Sequence2 from Seller Group by Seller
Union ALL
Select phonecalldate as DateMatch2, SellerID as Seller2, Sequence as Sequence2 from Seller Where Selling = 'true' ) as Boundary2
ON Boundary1.Seller1 = Boundary2 .Seller2 and ((Boundary1.Date1 = Boundary2.Date2 and Boundary1.Sequence1 < Boundary2 .Sequence2) or (Boundary1.Date1 < Boundary2.Date2 ))
此查询返回:
第一个查询左连接第二个查询
2018-01-01 - 100 - 0 - 2018-01-05 - 100 - 3
2018-01-01 - 100 - 0 - 2018-01-10 - 100 - 4
2018-01-01 - 100 - 0 - 2019-01-12 - 100 - 0
2018-01-05 - 100 - 3 - 2018-01-10 - 100 - 4
2018-01-05 - 100 - 3 - 2019-01-12 - 100 - 0
2018-01-10 - 100 - 4 - 2019-01-12 - 100 - 0
如何像这样为每个卖家提供最低的价格
2018-01-01 - 100 - 0 - 2018-01-05 - 100 - 3
2018-01-05 - 100 - 3 - 2018-01-10 - 100 - 4
2018-01-10 - 100 - 4 - 2019-01-12 - 100 - 0
同样,如何计算两个日期之间的总数????
结果应该是这样的
这才是我真正想要的
2018-01-01 - 100 - 0 - 2018-01-05 - 100 - 3 2
2018-01-05 - 100 - 3 - 2018-01-10 - 100 - 4 5
2018-01-10 - 100 - 4 - 2019-01-12 - 100 - 0 6
现在我有了我的边界,我想我可以找到多少:Selling=false
在我的结果之间
是否有人有更好的方法执行此查询以获取此信息
谢谢我希望这部分由问题的作者完成
DECLARE @Seller TABLE (
SellerID INT,
phonecalldate DATE,
[Sequence] INT,
Selling INT CHECK(Selling IN(0, 1)),
PRIMARY KEY (SellerID, phonecalldate, [Sequence])
);
INSERT @Seller(SellerID, phonecalldate, [Sequence], Selling)
VALUES
(100, '20180105', 1, 0),
(100, '20180105', 2, 0),
(100, '20180105', 3, 1),
(100, '20180105', 4, 0),
(100, '20180105', 5, 0),
(100, '20180110', 1, 0),
(100, '20180110', 2, 0),
(100, '20180110', 3, 0),
(100, '20180110', 4, 1),
(100, '20180110', 5, 0),
(100, '20180110', 6, 0),
(100, '20180110', 7, 0),
(100, '20180110', 8, 0),
(100, '20180110', 9, 0),
(100, '20180110', 10, 0);
可以使用以下查询获得获得所需结果所需的数据:
WITH
a AS (
SELECT
SellerID,
Selling,
FORMAT(phonecalldate, 'yyyyMMdd') +
FORMAT([Sequence], '00000000') AS dump,
SUM(Selling) OVER
(
PARTITION BY SellerID
ORDER BY phonecalldate, [Sequence]
) AS g
FROM @Seller
)
SELECT
COUNT(*) AS PhoneCallQty,
CAST(LEFT(MIN(dump), 8) AS DATE) AS StartDate,
CAST(RIGHT(MIN(dump), 8) AS INT) AS StartSeq,
CAST(LEFT(MAX(dump), 8) AS DATE) AS EndDate,
CAST(RIGHT(MAX(dump), 8) AS INT) AS EndSeq
FROM a
WHERE Selling = 0
GROUP BY SellerID, g;
输出:
我不知道你想要得到什么样的结果,最后两个表中的列是如何计算的,或者一些随机日期是从哪里来的。哇,这就是我想要的。伟大的逻辑。谢谢
+--------------+------------+----------+------------+--------+
| PhoneCallQty | StartDate | StartSeq | EndDate | EndSeq |
+--------------+------------+----------+------------+--------+
| 2 | 2018-01-05 | 1 | 2018-01-05 | 2 |
| 5 | 2018-01-05 | 4 | 2018-01-10 | 3 |
| 6 | 2018-01-10 | 5 | 2018-01-10 | 10 |
+--------------+------------+----------+------------+--------+