首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Tricky logic -SQL

Tricky logic -SQL
EN

Stack Overflow用户
提问于 2015-07-24 12:35:57
回答 5查看 105关注 0票数 2

这是我试图解决的一个棘手的场景。Table A1:有4列。并且这个表每2天更新一次。

代码语言:javascript
运行
复制
id    name  fav_color  date
2051  joe   white      07/21
2052  John  green      07/21

2天后,记录被更新,table A1看起来像这样。

代码语言:javascript
运行
复制
id    name  fav_color  date
2051  joe   blue       07/23
2052  Rick  green      07/23

Table A2:这是一个历史表,它捕获了对table A1所做的所有更改。

代码语言:javascript
运行
复制
id    updated_column   update_dt  old_value  new_value
2051  fav_color        07/23      white      blue
2052  Name             07/23      John       Rick 

现在,企业希望在月底看到表A1的每月快照。基本上我想要一个这样的每月快照。

代码语言:javascript
运行
复制
id    name  fav_color  date
2051  joe   white      07/21
2051  joe   blue       07/23
2052  John  green      07/21
2052  Rick  green      07/23

请告诉我如何做到这一点。

EN

回答 5

Stack Overflow用户

发布于 2015-07-24 13:08:36

代码语言:javascript
运行
复制
SELECT id,name,fav_color,date
FROM tableA1

UNION ALL

SELECT tableA2.id,
       CASE WHEN tableA2.updatedColumn ='name' 
            THEN tableA2.oldValue
            ELSE tableA1.name END,
       CASE WHEN tableA2.updatedColumn ='fav_color' 
            THEN tableA2.oldValue
            ELSE tableA1.fav_color END,
       tableA2.update_dt
FROM tableA2
INNER JOIN tableA1 ON tableA2.id=tableA1.id
ORDER BY id
票数 0
EN

Stack Overflow用户

发布于 2015-07-24 14:57:41

一种非常原始、缓慢而且可能不完整的方法,它或多或少应该返回您需要的内容:

代码语言:javascript
运行
复制
SELECT
  dates.id,
  dates.date,
  (SELECT TOP (1) name.new_value 
   FROM A2 name 
   WHERE name.id = dates.id and name.date <= dates.date and name.updated_column = 'name') as name,
  (SELECT TOP (1) favcol.new_value 
   FROM A2 favcol 
   WHERE favcol.id = dates.id and favcol.date <= dates.date and favcol.updated_column = 'fav_color') as fav_color
FROM A2 dates

按dates.id、dates.date排序

第一个值将被忽略。这可能是一个起点。

票数 0
EN

Stack Overflow用户

发布于 2015-07-24 21:08:54

有很多依赖项,但像这样的东西可能会做到这一点。

代码语言:javascript
运行
复制
select 
 name.id
, name.name 
, color.fav_color 
, color.update_dt
from 
(select 
 id
,update_dt
,new_value
from a2
where update_column = 'fav_color') color
join 
(select
 id
,update_dt
,new_value
from a2
where update_column = 'name') name
on color.id = name.id and color.update_dt = name.update_dt
order by color.update_dt, name.id
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31602270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档