【问题标题】:SQL How to link lowest row from another selectSQL如何从另一个选择链接最低行
【发布时间】:2019-01-12 18:42:46
【问题描述】:

我一周以来一直在寻找这个问题。我尝试了很多代码,但我无法得到正确的答案,这就是问题所在: 我有一个卖家表,每次客户联系这个卖家时,他是否卖了东西。

表卖家(我会为一个卖家提供数据,只是为了给你一个更具体的问题)

  • 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 中有答案:

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

这样如何让每个Seller1只有最低价?

  • 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

以同样的方式如何计算两个日期之间的总数???? 结果应该给我 (THIS) 这才是我真正要找的!!

  • 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 在我的结果之间。

有人有更好的方法来做这个查询吗?

谢谢

【问题讨论】:

  • 我无法弄清楚您想要得到什么结果,如何计算最后两个表格中的列,或者一些随机日期来自哪里。

标签: sql sql-server select group-by


【解决方案1】:

我希望这部分由问题的作者完成。

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

【讨论】:

  • 哇,这就是我要找的。伟大的逻辑。谢谢!
猜你喜欢
  • 2017-04-13
  • 2018-03-16
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多