我有多个审计日志(log)表,我正在try 找出一种在SQL中连接这些表以生成整体审计日志(log)的方法.

create table firstname_history(userid int, name string, timestamp date);
insert into firstname_history values 
(0, 'joe', '2000-01-01'),
(0, 'mark', '2000-01-12'),
(0, 'adam', '2000-01-21');

create table lastname_history(userid int, name string, timestamp date);
insert into lastname_history values 
(0, 'brown', '2000-01-03'),
(0, 'franklin', '2000-01-21'),
(0, 'hampton', '2000-01-27');

假设我有上面关于名字更改和姓氏更改的不同日志(log)表.我希望一条SQL语句生成全名的审计日志(log),考虑到同时更改(在2000-01-21上,名字和姓氏都同时更改,因此这应该只是一条记录).

因此,对于上面的内容,我需要一条SELECT语句来生成

+------------+-------+----------+
| timestamp  | first | last     |
+------------+-------+----------+
| 2000-01-01 | joe   | NULL     |
| 2000-01-03 | joe   | brown    |
| 2000-01-12 | mark  | brown    |
| 2000-01-21 | adam  | franklin |
| 2000-01-27 | adam  | hampton  |
+------------+-------+----------+

这样的 Select 在SQL中是可能的吗?我甚至不知道这种连接会被称为什么.

推荐答案

我没有Snowflake可用来验证,但我相信下面这样的东西应该可以满足您的需要

SELECT COALESCE(lnh.timestamp, fnh.timestamp) AS timestamp,
       COALESCE(lnh.userid, fnh.userid)       AS userid,
      LAST_VALUE(fnh.name) IGNORE NULLS  OVER (PARTITION BY COALESCE(lnh.userid, fnh.userid)  ORDER BY COALESCE(lnh.timestamp, fnh.timestamp) ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS first,
      LAST_VALUE(lnh.name) IGNORE NULLS  OVER (PARTITION BY COALESCE(lnh.userid, fnh.userid)  ORDER BY COALESCE(lnh.timestamp, fnh.timestamp) ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS last
FROM   lastname_history lnh
       FULL OUTER JOIN firstname_history fnh
                    ON lnh.userid = fnh.userid
                       AND lnh.timestamp = fnh.timestamp
ORDER  BY userid, timestamp 

SQL Server演示是https://dbfiddle.uk/VorITM-A

Sql相关问答推荐

判断时间之间是否有时间

Postgresql在加入时显示重复的行

我可以将INSERT语句与SELECT一起使用来创建条件吗?

基于多列比较连接两个表

用于过滤嵌套对象或数组中的JSON数据的WHERE条件

将日期时间转换为日期格式

如何从Spark SQL的JSON列中提取动态数量的键值对

根据Rails活动记录中时间戳/日期时间的时间部分从PostgreSQL中提取记录

在SQL GROUP BY中的某些行之后执行计算

缺少日期标识

在SQL中,筛选其他列中只有一个值的ID

排除具有部分匹配条件的记录

匹配 H[0-9][0-9] 但不匹配除字母 H 之外的任何字母

Postgresql:在链接表中判断相关表中插入值的条件

SQL 语句将一列中的值与另一列中的不同值相加,同时按第三列进行分组?

有没有办法在雅典娜中将字符串转换为 int ?

如何使用SQL将患者平均分配给他们所在地区的doctor

所有列分组的简写?

BigQuery Pivot 遗漏行

将单行中的多个行值转换为列