我们有两个SQL Server表,dbo.parentdbo.child.它是一个具有多个子元素的父级的一对多关系.每个子元素都有一个唯一的名称和effectiveTimestamp个值.

下面的当前工作查询将接受一个已知父代的数组,并 for each 父代从dbo.child中查找当前有效的子代.通过获取仍小于当前日期/时间的最大值effectiveTimestamp的子项来计算有效子项.这个查询运行得很好.

父元素可以只具有future 日期为effectiveTimestamp(晚于当前日期/时间)的子元素.在这种情况下,上面的查询不会返回这些父代的任何内容.目前,我们通过对第一个查询中没有返回的任何父代运行不同的第二个查询来实现这一点,但我觉得这是不必要的,希望将所有内容都包括在一个SQL查询中.

因此,我希望修改下面的查询,这样,如果父代没有有效的子代,则无论是否小于当前日期/时间,它都会查找最大值effectiveTimestamp.

SELECT 
    parentid,
    child.id,
    name,
    child.effectivetimestamp
FROM
    dbo.child AS child
INNER JOIN 
    (SELECT 
         Max([id]) AS id,
         Max([effectivetimestamp]) AS effectiveTimestamp
     FROM   
         dbo.child
     WHERE  
         parentid IN (1, 2, 3, 4, 5)
         AND effectivetimestamp <= GETDATE()
     GROUP BY 
         parentid) AS effectiveVersion ON child.id = effectiveVersion.id 

ANSWER

感谢大家的回应,我收到了多个解决方案,我相信会有工作.最后我使用了siggemannen建议的row_number().完整解决方案如下:

SELECT parentid,
       child.id,
       name,
       child.effectivetimestamp
FROM   dbo.child AS child
       INNER JOIN (SELECT *
                   FROM   (SELECT *,
                                  Row_number()
                                    OVER(
                                      partition BY parentid
                                      ORDER BY CASE WHEN effectivetimestamp <=
                                    Getdate(
                                    ) THEN 0
                                    ELSE 1 END
                                    ,
                                    effectivetimestamp DESC) AS 'rnk'
                           FROM   dbo.child) AS c
                   WHERE  parentid IN ( 1, 2, 3, 4, 5 )
                          AND rnk = 1) AS effectiveVersion
               ON child.id = effectiveVersion.id 

推荐答案

这可以通过窗口函数来解决:

select *
from (
   select *
   , row_number() over(partition by parentid order by case when effectivetimestamp <= Getdate() then 0 else 1 end, effectivetimestamp DESC) AS rnk
   FROM child
) c
where rnk = 1

row_number根据组(分区)和顺序(ORDER BY)创建一个值为1、2、3的列.

因此,对于每一位家长,我们希望优先考虑生效日期,而不是第一手的获取日期,最后是最后的日期.

where rnk = 1为我们提供了每个家长的最新子元素

Sql相关问答推荐

提取Snowflake SQL中的嵌套键

用相同值更新行

为什么postgres中CURRENT_TIMESTAMP的日期与CURRENT_DATE不同?

基于前面行的值:当x&>2时重复1,当连续3行x=0时则重复0

如何在postgres函数中插入后返回布尔值?

Ffltter&;Dart SQL Lite包:是否可以在一个查询中执行多条更新语句(每次执行不同的WHERE参数)

PostgreSQL使用SQL子查询在时间间隔内 Select 数据

SQL数据库规范化与数据插入

基于开始/结束日期重叠的BigQuery突发行

按二维数组的第一个元素排序

返回给定日期后的第 4 个工作日(不包括公众假期)

Postgres,使用 select 插入多个值

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

SQL Server:时态表并在运行时添加计算列

在Snowflake中如何使用SQL对版本字符串进行排序?

Clob 问题 - 将 clob 列拆分为多行

Teradata 多个进程的最大进程结束时间捕获

我需要遍历权重值表并确定每个权重是否有效

在 SQL 的每行选项中 Select 最大值

snowflake插入覆盖行为