首页 > 解决方案 > 更改数据的 SQL 长度

问题描述

我有一张桌子:

ID   |     date     |   Location A   |   Location B
1234    2018-06-16        Chicago          Chicago
1234    2018-06-15        Chicago          Chicago
1234    2018-06-14        Chicago          Chicago
1234    2018-06-13        Chicago          Florida
1234    2018-06-12        Baltimore        Florida
1234    2018-06-11        California       Florida
1234    2018-06-10        California       Florida
4444    2018-06-16        Utah             Utah
4444    2018-06-15        Utah             Utah
4444    2018-06-14        Utah             Utah
4444    2018-06-13        Chicago          Utah
4444    2018-06-12        Baltimore        Utah
4444    2018-06-11        California       Florida
4444    2018-06-10        California       Florida
6214    2018-06-16        Baltimore        Baltimore
6214    2018-06-15        Baltimore        Baltimore
6214    2018-06-14        Baltimore        Baltimore
6214    2018-06-13        Baltimore        Florida
6214    2018-06-12        Baltimore        Florida
6214    2018-06-11        Baltimore        Florida

我的目标是有一个新列,指示自位置 A 和位置 B 匹配以来的天数但仅当它们以前不匹配并且位置 B 与位置 A 更改之前或同一天的匹配相同时匹配和日期是最新的日期。

上表将如下所示

ID   |     date     |   Location A   |   Location B | Days Matched
1234    2018-06-16        Chicago          Chicago        3
4444    2018-06-16        Utah             Utah           3

ID 6214 不会出现在表中,因为位置 A 在位置 B 之前已经匹配超过 1 天。

标签: sqlsql-serversortingsql-server-2008

解决方案


我可以在没有小提琴的情况下做出的最佳尝试:

  • 获取每个 ID 的最新记录作为内部查询
  • 内部内部查询具有最高的未匹配日期
  • 外部查询拉取大于不匹配日期的计数。如果不匹配日期为空,则抓取所有记录

这是查询

SELECT A.ID, A.DATE, A.LOCATIONA, A.LOCATIONB,
    (SELECT COUNT(*) FROM TABLE V WHERE A.ID=V.ID AND (A.NOTMATCHEDDATE IS NULL OR V.NOTMATCHEDDATE>A.NOTMATCHEDDATE) AS CNT
FROM
(
SELECT ID, DATE, LOCATIONA, LOCATIONB,
    (
       SELECT MIN(DATE) FROM TABLE U WHERE T.ID=U.ID AND U.LOCATIONA<>U.LOCATIONB)
    ) AS NOTMATCHEDDATE,
FROM TABLE T
WHERE LOCATIONA=LOCATIONB AND 
  NOT EXISTS(SELECT * FROM TABLE S WHERE S.ID=T.ID AND S.DATE>T.DATE)
) A

推荐阅读