试图让我的大脑搁置一段时间,很多谷歌搜索,但无济于事。我的数据集包含以下需要查询的字段:DEPT,NUM,TERM,ITLE
。我有以下可能的行。
DEPT--NUM---TERM------TITLE
OSS - 1550 - 200830 - COURSE NAME (CI)
OSS - 1550 - 200930 - COURSE NAME (CI)
OSS - 1550 - 201230 - COURSE NAME
ENG - 1600 - 200930 - OTHER COURSE (CI)
OSS - 1600 - 200830 - ANOTHER COURSE (CI)
USS - 2500 - 201240 - COURSE (CI)
PSY - 1600 - 200830 - COURSE TITLE
我需要做的是使用这样的数据查询表格,然后拉出标题与查询匹配的DEPT/NUM
(OSS 1550),如果它是最新的标题。
因此,如果我搜索(CI),我想使用上面的集合(ENG 1600,OSS 1600,ISS 2500)获得3个结果,因为201230是OSS 1550的最新条目我不想要那个,但是我确实想要其他人。现在我不能为我的生活弄清楚如何编写一个能够做到这一点的查询。
任何帮助将不胜感激。如果我不够清楚,请告诉我。
修改
我只收到一条记录,根据您的说法,这就是我所使用的内容 选择数据。* FROM( SELECT SCBCRSE_SUBJ_CODE || ''|| SCBCRSE_CRSE_NUMB作为crs_combo, SCBCRSE_TITLE作为标题, row_number()结束(ORDER BY SCBCRSE_EFF_TERM DESC,SCBCRSE_CRSE_NUMB DESC)作为术语 来自SCBCRSE WHERE(SCBCRSE_TITLE喜欢'%'||:srch ||'%') )数据 WHERE data.term = 1
我的格式化现在正在运行......不知道为什么我有四个空格。
再次编辑 我想我没有提供足够的样本数据...见上面的编辑表。我需要三个记录,其中包含唯一的DEPT / NUM和标题中的CI,但不是具有旧标题和CI的记录。有意义。
抱歉不清楚。
答案......这是胜利者。
SELECT data.*
FROM (
SELECT SCBCRSE_SUBJ_CODE || ' ' || SCBCRSE_CRSE_NUMB AS crs_combo,
SCBCRSE_TITLE as title,
row_number() over (partition by SCBCRSE_SUBJ_CODE,SCBCRSE_CRSE_NUMB ORDER BY SCBCRSE_EFF_TERM DESC) as seqnum
FROM SCBCRSE
) data
WHERE seqnum = 1 AND title LIKE '%' || :srch || '%'
感谢大家的帮助。我在这上面浪费了几个小时,你用小步枪回答了它。
答案 0 :(得分:4)
您可以使用排名功能执行您想要的操作。但是,当我读到这个问题时,它并不像我原先想的那么清晰。以下内容获得与标题匹配的最新课程:
select t.*
from (select d.*,
row_number() over (order by term desc, num desc) as seqnum
from data d
where title like '%(CI)%'
) t
where seqnum = 1
这假设您使用的是2005或更高版本。
如果您要查找匹配的所有“最后”类,那么您可以尝试:
select t.*
from (select d.*,
row_number() over (partition by num order by term desc) as seqnum
from data d
) t
where seqnum = 1 and title like '%(CI)%'
这将返回最后一个类(基于num,order by term)与“(CI)”匹配的任何情况。这是我对你的问题的另一种解释。
答案 1 :(得分:2)
听起来你只想搜索MAX(TERM)
中的书籍,在这种情况下这会有效
IF OBJECT_ID('TEMPDB..#Books') IS NOT NULL
DROP TABLE #Books
CREATE TABLE #Books
(
DEPT VARCHAR(5),
NUM VARCHAR(10),
TERM VARCHAR(10),
TITLE VARCHAR(50)
)
INSERT INTO #BOOKS (DEPT, NUM, TERM, TITLE) VALUES('OSS','1550','200830','COURSE NAME (CI)')
INSERT INTO #BOOKS (DEPT, NUM, TERM, TITLE) VALUES('OSS','1550','200930','COURSE NAME (CI)')
INSERT INTO #BOOKS (DEPT, NUM, TERM, TITLE) VALUES('OSS','1550','201230','COURSE NAME')
INSERT INTO #BOOKS (DEPT, NUM, TERM, TITLE) VALUES('ENG','1600','200930','OTHER COURSE (CI)')
SELECT b.*
FROM #Books b
JOIN (
--Find the latest TERM
SELECT
DEPT, NUM, MAX(TERM) as TERM
FROM #Books
GROUP BY DEPT, NUM
) t
ON b.DEPT = t.DEPT
AND b.NUM = t.NUM
AND b.TERM = t.TERM
WHERE TITLE LIKE ('%(CI)%')
答案 2 :(得分:2)
;with a as
(
select * from
(
select t.*,
row_number() over (partition by DEPT,NUM order by TERM DESC) row from t
) b
where row=1
)
select * from a where TITLE like '%(CI)%';