2015-04-21 126 views
-3

我有一個表T1,列countryid, stateid, Value如何在SQL Server 2012的列中查找第一個非零值的行號

我需要的行號爲stateid值,每個國家都有第一個非零值。表中的數據按CountryId ASC, StateId ASC排序。

(Countryid, Stateid, Value) 
(1, 11, 0) 
(1, 12, 1) 
(1, 13, 0) 
(2, 21, 0) 
(2, 22, 0) 
(2, 23, 1) 
(3, 31, 0) 
(3, 32, 10) 
(3, 33, 0) 
(3, 34, 20) 

我需要像下面這樣的輸出。

  • 爲countryid 1,I需要作爲輸出行數應該爲2
  • 爲countryid 2,I需要作爲輸出的行號應爲3
  • 爲countryid 3,行號我需要作爲輸出應2.
+0

你怎麼知道你有「每」國家佔? –

+1

你可以在每個國家有多個非零值嗎?什麼構成「第一」非零價值?我們可以假設我們正在用StateId進行排序嗎? – ragerory

+0

是的,我可以有多個非零值每個國家 – immabh

回答

1

可以做到使用分區

;With CTE_T1 As 
(
    Select 
     CountryID, StateID, Value, 
     Row_Number Over (Partition By CountryID Order By Value) As RK 
    From 
     T1 
    Where 
     IsNull(Values, 0) <> 0 
) 
Select * 
From CTE_T1 
Where RK = 1 

通過在分區子句的順序將被用於到c如果有多個非零值,請選擇記錄。

1
WITH FormattedT1 AS 
(
    SELECT Countryid, Stateid, Value, ROW_NUMBER() OVER(PARTITION BY Countryid ORDER BY ...) AS num 
    FROM T1 
    WHERE Value > 0 
) 
SELECT Countryid, Stateid, Value 
FROM FormattedT1 
WHERE num = 1 
+0

'ORDER BY'是什麼? –

+0

使用您要排序的列。這將取決於業務邏輯。否則,只需添加countryid即可否定效果。 –

0

從所需的結果集猜測,作爲OP說,下面的查詢返回每countryid所需的「行號」:

SELECT countryid, MIN(rn) AS rn 
FROM (
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY countryid 
          ORDER BY stateid) AS rn 
    FROM T1) t 
WHERE Value <> 0 
GROUP BY countryid 

所以,我的猜測是對的T1每個記錄在每個countryid分區內分配行號。與最低stateid錄製countryid分區中有row number = 1,下一個記錄有row number = 2等基於OP的樣本數據

輸出:

countryid rn 
--------------- 
1   2 
2   3 
3   2 
相關問題