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) を検索すると、上記のセット (ENG 1600、OSS 1600、ISS 2500) を使用して 3 つの結果が必要になります。なぜなら、201230 は OSS 1550 の最新のエントリだからです。他人。今のところ、それを行うクエリを作成する方法を理解することはできません。

どんな助けでも大歓迎です。よくわからない場合はお知らせください。

編集

私は単一のレコードしか取得していません。これは、あなたが言ったことに基づいて使用しているものです。データを選択します。 DESC, SCBCRSE_CRSE_NUMB DESC) as term FROM SCBCRSE WHERE (SCBCRSE_TITLE LIKE '%' || :srch || '%') ) data WHERE data.term = 1

書式設定が機能するようになりました... 4 つのスペースがある理由がわかりません。

再度編集 十分なサンプル データが提供されていないと思います...上記の編集された表を参照してください。タイトルに固有の DEPT/NUM と CI を持つ 3 つのレコードが必要ですが、古いタイトルと 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

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 に答える
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 に答える