【问题标题】:How do I need to change my sql to get what I want in this case?在这种情况下,我需要如何更改我的 sql 以获得我想要的?
【发布时间】:2016-07-29 00:18:09
【问题描述】:

我有一张如下表:

id  value    date
1    5    2015-01-10
2    5    2015-06-13
3    5    2015-09-05
4    11   2015-02-11
5    11   2015-01-10
6    11   2015-01-25

可以看出,每个value 以不同的date 出现3 次。我想编写一个返回唯一values 的查询,该values 具有最大date,对于上表如下:

id  value    date
3    5    2015-09-05
4    11   2015-02-11

我该怎么做?

这是更新后的问题:

我遇到的真正问题比上面的简化版本要复杂一些。我以为一旦我知道了简化版的答案,我就可以更进一步,但我错了。所以,我在这里更新问题。

我有 2 个如下表:

      Table 1
id  id2    date
1    2   2015-01-10
2    5   2015-06-13
3    9   2015-09-05
4    10  2015-02-11
5    26  2015-01-10
6    65  2015-01-25

      Table 2
id  id2    data
1    2       A
2    5       A
3    9       A
4    10      B
5    26      B
6    65      B

这里,Table 1Table 2 加入了 id2

我想要得到的是如下两条记录:

id2  date       data
9   2015-01-10    A
10  2015-02-11    B

【问题讨论】:

    标签: sql database oracle group-by


    【解决方案1】:

    您可以使用row_number 选择每个值的日期最长的行

    select * from (
        select t2.id2, t1.date, t2.data, 
            row_number() over (partition by t2.data order by t1.date desc) rn
        from table1 t1
        join table2 t2 on t1.id = t2.id2
    ) t where rn = 1
    

    【讨论】:

    • 这是最直接的方法。用第 1 行标记每个值的最佳记录,然后只显示这些记录。
    • 感谢您的快速回复。我试图遵循您的想法,但无法到达任何地方,因为我面临的真正问题比我最初发布的要复杂一些。我刚刚更新了这个问题。再次感谢您。
    • @FuzzyTree 再次感谢您的更新。我仍然无法获得我需要的东西,因为我实际上要加入 5 张桌子。如果我仍然无法弄清楚,我会进一步研究并告诉你。
    • @FuzzyTree 我遇到的问题是我错误地在表 1 中添加了额外的列。我的表中实际上没有 value 列。所以我无法通过 t1.value 进行分区。我再次更新了问题。很抱歉一次又一次地更改问题。
    • @Dainy 分区 t2.data 然后
    【解决方案2】:
    select a.id, a.value, a.date
    from mytable a,
       ( select id, max(date) maxdate
           from mytable b
         group by id) b
    where a.id = b.id
      and a.date = b.maxdate;
    

    【讨论】:

    • 这个想法没问题,但是逗号分隔的连接语法在 20 多年前的标准 SQL-92 中已经过时了。 (诚​​然,Oracle 花了几年时间,但最终他们在 2001 年采用了与 Oracle 9i 的显式 ANSI 联接)。
    【解决方案3】:

    Oracle 设置

    CREATE TABLE Table1 ( id, id2, "date" ) AS
    SELECT 1,    2,   DATE '2015-01-10' FROM DUAL UNION ALL
    SELECT 2,    5,   DATE '2015-06-13' FROM DUAL UNION ALL
    SELECT 3,    9,   DATE '2015-09-05' FROM DUAL UNION ALL
    SELECT 4,    10,  DATE '2015-02-11' FROM DUAL UNION ALL
    SELECT 5,    26,  DATE '2015-01-10' FROM DUAL UNION ALL
    SELECT 6,    65,  DATE '2015-01-25' FROM DUAL;
    
    CREATE TABLE Table2 ( id, id2, data ) AS
    SELECT 1,    2,       'A' FROM DUAL UNION ALL
    SELECT 2,    5,       'A' FROM DUAL UNION ALL
    SELECT 3,    9,       'A' FROM DUAL UNION ALL
    SELECT 4,    10,      'B' FROM DUAL UNION ALL
    SELECT 5,    26,      'B' FROM DUAL UNION ALL
    SELECT 6,    65,      'B' FROM DUAL;
    

    查询

    SELECT MAX( t1.id  ) KEEP ( DENSE_RANK LAST ORDER BY t1."date" ) AS id,
           MAX( t1.id2 ) KEEP ( DENSE_RANK LAST ORDER BY t1."date" ) AS id2,
           MAX( t1."date" ) AS "date",
           t2.data
    FROM   Table1 t1
           INNER JOIN
           Table2 t2
           ON ( t1.id = t2.id AND t1.id2 = t2.id2 )
    GROUP BY t2.data
    

    输出

            ID        ID2 date                DATA
    ---------- ---------- ------------------- ----
             3          9 2015-09-05 00:00:00 A    
             4         10 2015-02-11 00:00:00 B    
    

    查询 2

    SELECT id,
           id2,
           "date",
           data
    FROM   (
      SELECT t1.*,
             t2.data,
             ROW_NUMBER() OVER ( PARTITION BY t2.data ORDER BY t1."date" DESC ) AS rn
      FROM   Table1 t1
             INNER JOIN
             Table2 t2
             ON ( t1.id = t2.id AND t1.id2 = t2.id2 )
    )
    WHERE  rn = 1;
    

    输出

            ID        ID2 date                DATA
    ---------- ---------- ------------------- ----
             3          9 2015-09-05 00:00:00 A    
             4         10 2015-02-11 00:00:00 B    
    

    【讨论】:

    • 谢谢@MT0!我已经按照 Fuzzy 的方法解决了 :-)
    • 嗨@MT0,我对此有一个后续问题,想知道您是否可以看一下,看看您是否可以帮助我。这是问题的链接:stackoverflow.com/questions/36502064/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2013-01-25
    • 2012-07-01
    相关资源
    最近更新 更多