合并 sql 中的两行并创建新列
Merge two rows in sql and create new columns
我的输入数据(table中的数据是):
我有这个要求,我需要找到第一个和最后一个条目以及第一个输入和最后一个 entered/modified。
当我有这样的查询时(不是精确的查询——这个查询是一团糟,为了 PoC,我正在简化):
Select field1, field2, min(EnteredDate), max(EnteredDate) from table where field = <fieldvalue> group by field1 AND EnteredBy
不要问我为什么要按“EnteredBy”分组,这是我处理的烂摊子,是前团队干的。
现在的结果是这样的
实际上查询的输出应该如下所示:
有人可以指导我如何实现这一目标吗?谢谢!
文本格式的预期输出:
Field1 Field2 First entered by First entered date Last entered By Last Entered Date
1 hello User1 3/9/2022 User2 3/11/2022
2 somenew User2 3/10/2022 User1 3/11/2022
要获取具有某些指定顺序的第一行/最后一行的值,请使用 window functions first_value / last_value
必须明确指定 window 框架子句才能使 LAST_VALUE
正常工作,因为默认框架是 RANGE UNBOUNDED PRECEDING AND CURRENT ROW
,它始终为 LAST_VALUE
生成当前行。
DISTINCT
删除以下查询中的所有重复行,并且 returns 对于 field1, field2
的每个组合仅删除 1 行
SELECT DISTINCT
field1
, field2
, FIRST_VALUE(entered_by) OVER w first_entered_by
, FIRST_VALUE(entered_date) OVER w first_entered_date
, LAST_VALUE(entered_by) OVER w last_entered_by
, LAST_VALUE(entered_date) OVER w last_entered_date
FROM mytable
WINDOW w AS (
PARTITION by field1, field2
ORDER BY entered_date
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)
ORDER BY field1
Here's a DB Fiddle illustrating how to do it with sample data & set up code
我的输入数据(table中的数据是):
我有这个要求,我需要找到第一个和最后一个条目以及第一个输入和最后一个 entered/modified。 当我有这样的查询时(不是精确的查询——这个查询是一团糟,为了 PoC,我正在简化):
Select field1, field2, min(EnteredDate), max(EnteredDate) from table where field = <fieldvalue> group by field1 AND EnteredBy
不要问我为什么要按“EnteredBy”分组,这是我处理的烂摊子,是前团队干的。
现在的结果是这样的
实际上查询的输出应该如下所示:
有人可以指导我如何实现这一目标吗?谢谢!
文本格式的预期输出:
Field1 Field2 First entered by First entered date Last entered By Last Entered Date
1 hello User1 3/9/2022 User2 3/11/2022
2 somenew User2 3/10/2022 User1 3/11/2022
要获取具有某些指定顺序的第一行/最后一行的值,请使用 window functions first_value / last_value
必须明确指定 window 框架子句才能使 LAST_VALUE
正常工作,因为默认框架是 RANGE UNBOUNDED PRECEDING AND CURRENT ROW
,它始终为 LAST_VALUE
生成当前行。
DISTINCT
删除以下查询中的所有重复行,并且 returns 对于 field1, field2
SELECT DISTINCT
field1
, field2
, FIRST_VALUE(entered_by) OVER w first_entered_by
, FIRST_VALUE(entered_date) OVER w first_entered_date
, LAST_VALUE(entered_by) OVER w last_entered_by
, LAST_VALUE(entered_date) OVER w last_entered_date
FROM mytable
WINDOW w AS (
PARTITION by field1, field2
ORDER BY entered_date
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)
ORDER BY field1
Here's a DB Fiddle illustrating how to do it with sample data & set up code