2013-04-30 156 views
1

我的問題與sql select from multiple records only the most recent非常相關,雖然它根本不起作用。在同一查詢中選擇多個記錄中的最近記錄

我有一個view,獲取成員名稱和他們當前的排名數字。 我也有一張表,它發現所有等級名稱都大於上述等級號碼。

按原樣,新視圖顯示當前成員以及排名標題表中的排名標題>=

這意味着輸出顯示每個標題的排名後,而我只想顯示第一個(最早)。

我已經嘗試了變形例從上面的鏈接,像這樣:

SELECT dbo.vwGetMemberRank.siteMemberId AS ID 
    , dbo.vwGetMemberRank.memberNickname AS Nick 
    , dbo.vwGetMemberRank.siteMemberRankLevel AS currentPoints 
    , dbo.tblSiteMemberRankTitle.siteMemberRankLevel AS neededPoints 
    , dbo.tblSiteMemberRankTitle.siteMemberRankTitle AS rankTitle 
FROM dbo.vwGetMemberRank 
    INNER JOIN dbo.tblSiteMemberRankTitle 
     ON dbo.vwGetMemberRank.siteMemberRankLevel >= dbo.tblSiteMemberRankTitle.siteMemberRankLevel 

WHERE dbo.vwGetMemberRank.siteMemberId IN 
       (
        SELECT MIN(siteMemberId) AS ID 
        FROM dbo.vwGetMemberRank AS vwGetMemberRank_1 
        GROUP BY siteMemberRankLevel 
       ) 

這仍然顯示每隔標題。

編輯

vwGetMemberRank

SELECT dbo.tblSiteMemberRank.siteMemberId 
    , dbo.tblSiteMemberRank.siteMemberRankLevel 
    , dbo.tblSiteMemberDetail.memberNickname 
FROM dbo.tblSiteMemberDetail 
    INNER JOIN dbo.tblSiteMemberRank ON dbo.tblSiteMemberDetail.siteMemberId = dbo.tblSiteMemberRank.siteMemberId 

tblSiteMemberRankTitle

CREATE TABLE [dbo].[tblSiteMemberRankTitle](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [siteMemberRankTitle] [varchar](30) NOT NULL, 
    [siteMemberRankDescription] [varchar](80) NULL, 
    [siteMemberRankLevel] [int] NULL, 
    [thumbnailLocation] [nvarchar](100) NULL, 
CONSTRAINT [PK__tblSiteM__3213E83F1B0907CE] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
+1

你檢查出LAG()和鉛( )? http://msdn.microsoft.com/en-us/library/hh213125.aspx – 2013-04-30 12:47:00

+0

從來沒有聽說過。現在將閱讀它。 - 你可以在這個過渡期間提供一個例子嗎? – TheGeekZn 2013-04-30 12:47:26

+0

基本上你創建一個窗口/偏移量來說「我想要這個函數的結果,對於離我很遠的一行,當我命令所有這樣的行時」。這是非常有效的,因爲您不必自行加入任何東西;你只需重用你在FROM子句中的集合。 – 2013-04-30 12:49:20

回答

1

可以使用ROW_NUMBER功能來訂購你喜歡的任何順序行列(我用dbo.tblSiteMemberRankTitle.siteMemberRankLevel DESC),然後將結果限制在ROWNUMBER爲1,因此只獲得最高siteMemberRankLevel行每個SiteMemberID(PARTITION BY)

WITH CTE AS 
( SELECT dbo.vwGetMemberRank.siteMemberId AS ID 
     , dbo.vwGetMemberRank.memberNickname AS Nick 
     , dbo.vwGetMemberRank.siteMemberRankLevel AS currentPoints 
     , dbo.tblSiteMemberRankTitle.siteMemberRankLevel AS neededPoints 
     , dbo.tblSiteMemberRankTitle.siteMemberRankTitle AS rankTitle 
     , RowNumber = ROW_NUMBER() OVER(PARTITION BY dbo.vwGetMemberRank.siteMemberId ORDER BY dbo.tblSiteMemberRankTitle.siteMemberRankLevel DESC) 
    FROM dbo.vwGetMemberRank 
      INNER JOIN dbo.tblSiteMemberRankTitle 
       ON tblSiteMemberRankTitle.siteMemberRankLevel >= dbo.vwGetMemberRank.siteMemberRankLevel 
) 
SELECT ID, Nick, CurrentPoints, NeededPoints, RankTitle 
FROM CTE 
WHERE RowNumber = 1; 
+0

這似乎很好,除了我需要每個成員的排名。這只是顯示列出的第一位成員。 – TheGeekZn 2013-04-30 13:42:42

+0

你是否從你的查詢中刪除了where子句('WHERE dbo.vwGetMemberRank.siteMemberId IN(SELECT MIN(siteMemberId)AS ID ...'),如果不是這可能是原因的話 – GarethD 2013-04-30 13:55:15

+0

是的,我基本上覆制+粘貼。:P – TheGeekZn 2013-04-30 13:57:55