2012-07-14 2 views
0

에 나는 MongoDB의에서이 같은 쿼리 뭔가를 작성해야 ROW_NUMBER()와 RANK() MongoDB를

(ProductID INT, ProductStartDate date, ProductExpDate date, 
ProductTypeID int, #PacketsInProduct int, 
Price int, Discount int, Score int) 

스키마

이하와 제품의 테이블이 있습니다. 나는 C# 드라이버 1.5를 사용하고있다. RowNUMBER()가 두 번째 CTE에서 행을 필터링해야하는 순위를 기반으로 내 where 조건과 일치하는 제품 순위를 결정하는 첫 번째 CTE (Products_CTE)에서 문제가 발생합니다. 내 모든 조건이 역동적입니다. 누구든지 나를 도울 수 있습니까? 미리 감사드립니다.

;WITH Products_CTE 
      AS 
      (
       SELECT 
        ROW_NUMBER() OVER(PARTITION BY ProductID ORDER BY Score Desc, Price Asc) as RankByProduct, 
        * 
       FROM Products 
        WHERE 
          ProductID IN (1,2,3) 
          AND ProductTypeID IN (001,002) 
          AND [#PacketsInProduct] >3 and [#PacketsInProduct] <10 
         and ProductExpDate < GETDATE() 

      ), 
      Products2_CTE 
      AS 
      (
       SELECT 
        ROW_NUMBER() OVER (ORDER BY Score DESC, Price ASC) as rownum, 
        * 
       FROM Products_CTE 
       WHERE RankByProduct <= 3 
      ) 
      SELECT 
       * 
        from Products2_CTE cte1 
      where rownum BETWEEN 15 AND 25 
       ORDER BY [Score] DESC, [Price] ASC 

답변

1

이 쿼리는지도 작성/축소를 요구할 예정입니다. 문서 (여기)를 확인하십시오 : http://www.mongodb.org/display/DOCS/MapReduce.

map/reduce를 구성하는 데 도움이 필요하면 알려주세요. 최선을 다하겠습니다. 나는 당신이 그것을 먼저 시도하는 것이 좋습니다. map/reduce는 실시간 질의를위한 것이 아니므로 결과를 스냅 샷해야합니다. 즉, 결국 일관된 데이터로 작업하고 있다는 것을 의미합니다. 비즈니스는 이에 대해 알 필요가 있으며 확인해야합니다.

또한 필요에 따라이 유형의 쿼리에 대해 스키마를 최적화 할 수 있습니다. 관계형 데이터베이스에 저장하는 것과 같은 방법으로 mongodb에 데이터를 저장하는 것은 거의 올바른 선택이 아닙니다. 올바른 선택이라면 어쨌든 관계형 모델을 사용해야 할 가능성이 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 Map/Reduce를 시도했지만 그걸로 순위를 매기는 방법을 알아낼 수 없었다. 나는 이것을 실시간 웹 사이트에 구축하고 있는데, 순위 지정, 그룹화의 경우 Mongo DB를 제안하지 않겠습니까? 여기 캐 센들 라를 선택 하는게 어때요? 내 테이블의 스키마에 대해서는 매우 적은 수의 컬럼으로 구성된 평범한 테이블이며 스키마에서 변경 될 사항이나 코멘트가 보이지 않습니까? 다시 고마워 ... –

+0

그래서, 왜 당신이 nosql 솔루션을 원하는 내 질문에 맞춰. 당신은 분명히 아주 작은 스키마를 가진 작업 솔루션을 가지고 있습니다. mongodb를 사용하려는 경우 쿼리 포인트에서 집계하는 대신 데이터가 비정규 화되고 변경 될 때 업데이트되도록 유지하는 것이 좋습니다. 이론적으로 계산이 필요 없으므로 매우 빠릅니다. –