假如有一張課程表,有兩列,分別是:課程ID,唯一;課程名,可以重名。假如第一節課是語文,第二節是數學,第三節是語文,那我該如何知道第一節課是語文的情況下,下一次語文在第幾節(也就是第三節),并且知道它的課程ID。
uj5u.com熱心網友回復:
--建立臨時表
IF OBJECT_ID('TEMPDB..#Tab1') IS NOT NULL
DROP TABLE #Tab1
select * into #Tab1 from ( --插入測驗資料
select 課程ID = 1,課程名 = '語文'
union all
select 課程ID = 2,課程名 = '數學'
union all
select 課程ID = 3,課程名 = '語文'
) as Tab1
--查詢裝有測驗資料的臨時表
--select * from #Tab1
select
*
,row = ROW_NUMBER() over(partition by 課程名 order by 課程id) --用開窗函式給新列row賦值,新增列row值為重復出現課程名的'當前次數',所謂'當前'將會依據課程id排序
from #Tab1
order by 課程ID --可加可不加,不加則結果順序將會依照開窗函式排序規則。加上會維持原表順序,利于你查看開窗函式到底有什么效果
--最后,我們來看下一次幼ò肝出現在第幾節(課程ID),該如何查詢
select
*
from(
select
*
,row = ROW_NUMBER() over(partition by 課程名 order by 課程id)
from #Tab1
) as A
where A.課程名 = '語文' and A.row = 2
uj5u.com熱心網友回復:
CREATE TABLE #A(id int,課程名 VARCHAR(20))
INSERT INTO #A
SELECT 1,'語文' UNION ALL
SELECT 2,'數學' UNION ALL
SELECT 3,'英語' UNION ALL
SELECT 4,'語文' UNION ALL
SELECT 5,'物理' UNION ALL
SELECT 10,'語文'
select * from #A
declare
@課程名 varchar(20) = '語文',
@第幾節 int = 3
select '第'+cast(a.xxx as varchar(5))+'節課' ,a.課程名 from
(
select *,ROW_NUMBER() over(partition by 課程名 order by id) xx,ROW_NUMBER() over(order by id) xxx from #A
) a where a.課程名=@課程名 and a.xx=@第幾節

不知道是不是要這個效果
uj5u.com熱心網友回復:
CREATE TABLE #A(id int,課程名 VARCHAR(20))
INSERT INTO #A
SELECT 1,'語文' UNION ALL
SELECT 2,'數學' UNION ALL
SELECT 3,'英語' UNION ALL
SELECT 4,'語文' UNION ALL
SELECT 5,'物理' UNION ALL
SELECT 10,'語文'
--借 #2 資料
--查詢
--已知 前面的 語文,id 為 1, 求下一個 語文 課 id
SELECT TOP 1 *
from #A WHERE [課程名]='語文' AND id>1
ORDER BY id
/*
id 課程名
4 語文
*/
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/229600.html
標籤:應用實例
上一篇:SQL SERVER Cross apply 與Outer apply的真正用法是怎么樣的?
下一篇:關于sqlserver
