sql - 更改数据的 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 天。
解决方案
我可以在没有小提琴的情况下做出的最佳尝试:
- 获取每个 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
推荐阅读
- python - 硒返回空列表
- flutter - 将项目添加到列表中不会呈现新项目(AnimatedList)
- javascript - 使用 GraphQL (Nuxt) 访问嵌套节点
- php - Woocommerce 5.4.1 - 显示不带小数的价格
- python - 通过将字符串连接到数据框列上的数学运算结果来下标列
- testing - Salesforce 中 Apex 触发器测试的必填字段缺失错误
- mediawiki - 将 Google 字体添加到 MediaWiki 皮肤
- php - woocommerce_add_to_cart_validation Ajax 中的错误
- vue.js - Vue3:当值满足特定条件时如何防止进一步输入
- python - 尝试按其字段对 JSON 进行排序会引发 TypeError