1

试图绞尽脑汁,大量谷歌搜索,但无济于事。我有一个数据集,其中包含我需要查询的以下字段: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),我想要 3 个使用上述设置的结果(ENG 1600、OSS 1600、ISS 2500),因为 201230 是 OSS 1550 的最新条目,我不想要那个,但我确实想要其他。现在,我一生都无法弄清楚如何编写一个可以做到这一点的查询。

任何帮助,将不胜感激。如果我不够清楚,请告诉我。

编辑

我只得到一条记录,这是我根据您所说的 SELECT data.* FROM ( SELECT SCBCRSE_SUBJ_CODE || ' ' || SCBCRSE_CRSE_NUMB AS crs_combo, SCBCRSE_TITLE as title, row_number() over (ORDER BY SCBCRSE_EFF_TERM DESC, SCBCRSE_CRSE_NUMB DESC) 作为 SCBCRSE WHERE (SCBCRSE_TITLE LIKE '%' || :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 || '%'

谢谢大家的帮助。我在这上面浪费了几个小时,而你却用小步舞曲回答了它。

4

3 回答 3

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,按术语排序)与“(CI)”匹配的任何情况。这是我对你的问题的另一种解释。

于 2012-08-17T17:35:01.390 回答
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)%')
于 2012-08-17T17:46:50.353 回答
2

这是一个SQLFiddle 示例

;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)%';
于 2012-08-17T17:58:32.310 回答