【问题标题】:Comparing SQL Rows with each other in MSSQL?在 MSSQL 中比较 SQL 行?
【发布时间】:2014-05-18 13:22:10
【问题描述】:

我刚刚启动 SQL,在解决以下 SQL 时遇到问题 --> 我们有一个包含 3 列的客户表,需要根据日期列进行比较。

  • 每个客户都有一个申请日期,我们需要在接下来的 7 天内再次收到申请的客户。
  • 创建一个将标志设置为 1 的新列,其中收到最近 7 天的申请。

数据:

Customer_ID  | App_ID (PK)| App_Date
200               13    12/28/2013
200               23    12/26/2013
300               11    12/15/2013
200               54    12/15/2013
300               32    12/15/2013
200                9    12/2/2013
100                6    12/22/2013

答案:

Customer_ID  | App_ID (PK)| App_Date   | Flag
200               13    12/28/2013 
200               23    12/26/2013    1
300               11    12/15/2013
200               54    12/15/2013    1
300               32    12/15/2013    1
200                9    12/2/2013
100                6    12/22/2013

谢谢。

【问题讨论】:

  • 不确定我是否理解这里的逻辑,例如为什么客户 200 在12/15/2013 上的应用程序而不是12/2/2013 上的应用程序被标记?

标签: sql sql-server database union jointable


【解决方案1】:

您可以使用first_value 分析函数来查找每个客户的最早日期。从那里开始,只需减去日期即可:

SELECT customer_id, app_id, app_date,
       CASE WHEN DATEDIFF (day, first_date, app_date) > 7 THEN 1 
            ELSE null END 
       AS flag
FROM   (SELECT customer_id, app_id, app_date, 
               FIRST_VALUE (app_date) OVER 
                  (PARTITION BY customer_id ORDER BY app_date ASC) AS first_date
        FROM   my_table) t

【讨论】:

  • 嗯...提问者似乎很高兴,但没有给出问题的预期结果。
【解决方案2】:

测试数据

DECLARE @TABLE TABLE(Customer_ID INT,App_ID INT,App_Date DATE)
INSERT INTO @TABLE VALUES
(200,13,'12/28/2013'),(200,23,'12/26/2013'),(300,11,'12/15/2013')
,(200,54,'12/15/2013'),(300,32,'12/15/2013'),(200, 9,'12/2/2013')
,(100, 6,    '12/22/2013')

查询

; WITH CTE
AS (
     SELECT * 
       ,ROW_NUMBER() OVER (PARTITION BY Customer_ID ORDER BY App_Date) rn
     FROM @table
    )
SELECT C1.Customer_ID
      ,C1.App_ID
      ,C1.App_Date
      ,CASE WHEN DATEDIFF(DAY, C1.App_Date, C2.App_Date) <= 7 
            THEN 1 ELSE NULL END AS Flag
FROM CTE C1 LEFT JOIN CTE C2
ON C1.rn = C2.rn + 1
AND C1.Customer_ID = C2.Customer_ID

结果集

╔═════════════╦════════╦════════════╦══════╗
║ Customer_ID ║ App_ID ║  App_Date  ║ Flag ║
╠═════════════╬════════╬════════════╬══════╣
║         100 ║      6 ║ 2013-12-22 ║ NULL ║
║         200 ║      9 ║ 2013-12-02 ║ NULL ║
║         200 ║     54 ║ 2013-12-15 ║ 1    ║
║         200 ║     23 ║ 2013-12-26 ║ 1    ║
║         200 ║     13 ║ 2013-12-28 ║ 1    ║
║         300 ║     11 ║ 2013-12-15 ║ NULL ║
║         300 ║     32 ║ 2013-12-15 ║ 1    ║
╚═════════════╩════════╩════════════╩══════╝

【讨论】:

  • 谢谢.. 我会定义的。投票..我没有声誉。 :{ (@newOne)
  • 没问题,很高兴您找到了解决方案 :)
  • 嗯...提问者似乎很高兴,但没有给出问题的预期结果。
  • @JoachimIsaksson 所需的结果集是手写的,它似乎确实是一个记录。我也有同样的担忧,但我们在这里已经看到很多次了,所需的输出是 1 或 2 条记录:)
猜你喜欢
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
相关资源
最近更新 更多