SQL SERVER - 棘手的Select语句

时间:2012-08-17 17:30:05

标签: sql sql-server

试图让我的大脑搁置一段时间,很多谷歌搜索,但无济于事。我的数据集包含以下需要查询的字段: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 || '%'

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

3 个答案:

答案 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)

这是SQLFiddle example

;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)%';