SQL:按字段a或字段b分组行

SQL:按字段a或字段b分组行,sql,amazon-redshift,Sql,Amazon Redshift,我不确定这在SQL中是否可行。我的表中有两个字段a和b。当行具有相同的a值或相同的b值时,我希望对表中的记录进行分组,然后提取另一个具有最新时间戳的字段的值。这可能吗?我用的是红移 下面是一个示例表: || key1 || key2 || date || value || | 1 | 'a' | '2019-01-01' | 'john' | | 1 | 'b' | '2019-01-03' | 'ben' | | 2 | 'c' | '2019-02-01' | 'kim' | | 3 | '

我不确定这在SQL中是否可行。我的表中有两个字段a和b。当行具有相同的a值或相同的b值时,我希望对表中的记录进行分组,然后提取另一个具有最新时间戳的字段的值。这可能吗?我用的是红移

下面是一个示例表:

|| key1 || key2 || date || value ||
| 1 | 'a' | '2019-01-01' | 'john' |
| 1 | 'b' | '2019-01-03' | 'ben' |
| 2 | 'c' | '2019-02-01' | 'kim' |
| 3 | 'c' | '2019-02-02' | 'dan' |
| 4 | 'd' | '2019-02-03' | 'jan' |
最终我想要的是:

| 'ben' |
| 'dan' | 
| 'jan' |

假设:日期值对于所有记录都是唯一的

我想到了这个:

select mytable.value1
  from (select key1, max(date1) max_date1 from mytable group by key1) q1
  inner join (select key2, max(date1) max_date1 from mytable group by key2) q2
    on q2.max_date1 = q1.max_date1
  inner join mytable on mytable.date1 = q1.max_date1
基于此模式:

create table myTable (
  key1 int,
  key2 nvarchar(1),
  date1 date,
  value1 nvarchar(20)
  );

insert into mytable values
  (1, 'a', '2019-01-01', 'john'),
  (1, 'b', '2019-01-03', 'ben'),
  (2, 'c', '2019-02-01', 'kim'),
  (3, 'c', '2019-02-02', 'dan');

您可以尝试为这两个键编写一个按行数和求和窗口函数的结果集

然后从组中获取rn=1最新的行

问题1:

:


您将如何处理匹配a和b值重叠的情况?感谢@GordonLinoff的精彩评论。我添加了一些示例数据和我想要的结果。谢谢@Nick。我最后想要的结果是你所说的?在我的案例中,这很好处理,但不是必须的澄清:您的结果表明,创建了以下组:john、ben-key1=1 kim、dan-key2=c julia、dennis、mike-??为什么朱莉娅和迈克在同一组?这张唱片是否也属于第三组:| 5 |‘f’|‘2019-03-04’|‘吉姆’|?@RichG我想这更令人困惑。”“朱莉娅”和“丹尼斯”属于同一组,因为他们的钥匙是1丹尼斯和迈克是同一组的,因为他们有钥匙。我希望这两个团体能够合并。但这不是必须的。实际上,让我在没有最后一个案例的情况下修改这个问题。我遗漏了一个重要案例,并将其添加到示例表4和d中。谢谢@kee Ok只需为条件添加cnt1=1和cnt2=1。
SELECT value 
FROM (
  SELECT value,
         sum(1) OVER(PARTITION BY key1 ORDER BY key1) cnt1,
         sum(1) OVER(PARTITION BY key2 ORDER BY key2) cnt2 ,
         ROW_NUMBER () OVER(PARTITION BY key1 ORDER BY date DESC) rn1,
         ROW_NUMBER () OVER(PARTITION BY key2 ORDER BY date DESC) rn2
  FROM T
) t1
WHERE 
   (rn1 = 1 and cnt1 > 1) 
or
   (rn2 = 1 and cnt2 > 1)
or 
   (cnt1 = 1 and cnt2 = 1)
| value |
|-------|
|   ben |
|   dan |
|   jan |