Oracle SQLDeveloper:如何根据 YEAR 范围获取唯一值的压缩列表
Oracle SQLDeveloper: How to get a condensed list of Unique values based on YEAR range
我有一个包含 4 列的 table:NAME、STARTYEAR、ENDYEAR、IDNUM
如何获得不同的列表,其中 STARTYEAR 是不同 NAME 和 IDNUM 的最小年份,ENDYEAR 是不同 NAME 和 IDNUM 的最大年份。
示例table:
CREATE TABLE ZZ_YEARRANGE (
NAME varchar(10),
STARTYEAR varchar(5),
ENDYEAR varchar(5),
IDNUM varchar(10));
INSERT ALL
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Derick','1995','1998','ABC-100')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Derick','1999','2005','ABC-100')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Derick','1998','2003','ABC-101')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Rick','2001','2010','DEF-200')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Rick','2007','2015','DEF-200')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Rick','2002','2008','DEF-201')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Chad','1990','2001','ABC-100')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Chad','2002','2004','GHI-301')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Chad','1997','2003','GHI-300')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Brandon','1985','1995','JKL-400')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Brandon','1999','2009','JKL-401')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Brandon','1996','2002','JKL-400')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Brandon','2003','2007','JKL-400')
select 1 from DUAL;
Table 应该是这样的:
Derick 1995 1998 ABC-100
Derick 1999 2005 ABC-100
Derick 1998 2003 ABC-101
Rick 2001 2010 DEF-200
Rick 2007 2015 DEF-200
Rick 2002 2008 DEF-201
Chad 1990 2001 ABC-100
Chad 2002 2004 GHI-301
Chad 1997 2003 GHI-300
Brandon 1985 1995 JKL-400
Brandon 1999 2009 JKL-401
Brandon 1996 2002 JKL-400
Brandon 2003 2007 JKL-400
我想要得到的结果是:
Derick 1995 2005 ABC-100
Derick 1998 2003 ABC-101
Rick 2001 2015 DEF-200
Rick 2002 2008 DEF-201
Chad 1990 2001 ABC-100
Chad 2002 2004 GHI-301
Chad 1997 2003 GHI-300
Brandon 1985 2007 JKL-400
Brandon 1999 2009 JKL-401
很简单,只要将distinct列放在GROUP BY
中,然后根据需要在其他列中添加MIN
和MAX
:
select NAME, min(STARTYEAR) STARTYEAR, max(ENDYEAR) ENDYEAR, IDNUM
from ZZ_YEARRANGE
group by NAME, IDNUM
order by NAME, IDNUM
NAME STARTYEAR ENDYEAR IDNUM
---------- --------- ------- ----------
Brandon 1985 2007 JKL-400
Brandon 1999 2009 JKL-401
Chad 1990 2001 ABC-100
Chad 1997 2003 GHI-300
Chad 2002 2004 GHI-301
Derick 1995 2005 ABC-100
Derick 1998 2003 ABC-101
Rick 2001 2015 DEF-200
Rick 2002 2008 DEF-201
我有一个包含 4 列的 table:NAME、STARTYEAR、ENDYEAR、IDNUM
如何获得不同的列表,其中 STARTYEAR 是不同 NAME 和 IDNUM 的最小年份,ENDYEAR 是不同 NAME 和 IDNUM 的最大年份。
示例table:
CREATE TABLE ZZ_YEARRANGE (
NAME varchar(10),
STARTYEAR varchar(5),
ENDYEAR varchar(5),
IDNUM varchar(10));
INSERT ALL
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Derick','1995','1998','ABC-100')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Derick','1999','2005','ABC-100')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Derick','1998','2003','ABC-101')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Rick','2001','2010','DEF-200')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Rick','2007','2015','DEF-200')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Rick','2002','2008','DEF-201')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Chad','1990','2001','ABC-100')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Chad','2002','2004','GHI-301')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Chad','1997','2003','GHI-300')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Brandon','1985','1995','JKL-400')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Brandon','1999','2009','JKL-401')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Brandon','1996','2002','JKL-400')
INTO ZZ_YEARRANGE (NAME,STARTYEAR,ENDYEAR,IDNUM) VALUES ('Brandon','2003','2007','JKL-400')
select 1 from DUAL;
Table 应该是这样的:
Derick 1995 1998 ABC-100
Derick 1999 2005 ABC-100
Derick 1998 2003 ABC-101
Rick 2001 2010 DEF-200
Rick 2007 2015 DEF-200
Rick 2002 2008 DEF-201
Chad 1990 2001 ABC-100
Chad 2002 2004 GHI-301
Chad 1997 2003 GHI-300
Brandon 1985 1995 JKL-400
Brandon 1999 2009 JKL-401
Brandon 1996 2002 JKL-400
Brandon 2003 2007 JKL-400
我想要得到的结果是:
Derick 1995 2005 ABC-100
Derick 1998 2003 ABC-101
Rick 2001 2015 DEF-200
Rick 2002 2008 DEF-201
Chad 1990 2001 ABC-100
Chad 2002 2004 GHI-301
Chad 1997 2003 GHI-300
Brandon 1985 2007 JKL-400
Brandon 1999 2009 JKL-401
很简单,只要将distinct列放在GROUP BY
中,然后根据需要在其他列中添加MIN
和MAX
:
select NAME, min(STARTYEAR) STARTYEAR, max(ENDYEAR) ENDYEAR, IDNUM
from ZZ_YEARRANGE
group by NAME, IDNUM
order by NAME, IDNUM
NAME STARTYEAR ENDYEAR IDNUM
---------- --------- ------- ----------
Brandon 1985 2007 JKL-400
Brandon 1999 2009 JKL-401
Chad 1990 2001 ABC-100
Chad 1997 2003 GHI-300
Chad 2002 2004 GHI-301
Derick 1995 2005 ABC-100
Derick 1998 2003 ABC-101
Rick 2001 2015 DEF-200
Rick 2002 2008 DEF-201