2013-06-03 12 views
6

chcę uzyskać tego rodzaju skutek korzystania MS SQLJak uzyskać numer wiersza na podstawie unikalnego pola i klasyfikowane według innego pola

PAGE 1 
ID  Research Title  Published Date Author ID Author Name 
1  Research A   2013-5-10   D567   John 
1  Research A   2013-5-10   D568   Stan 
2  Research B   2013-5-9   D569   Steve 
3  Research C   2013-5-8   D570   Michael 

PAGE 2 
ID  Research Title  Published Date Author ID Author Name 
4  Research D   2013-5-8   D567   John 
5  Research F   2013-5-7   D570   Michael 
5  Research F   2013-5-7   D568   Stan  
5  Research F   2013-5-7   D569   Steve  
6  Research E   2013-5-6   D569   Steve 

wynik jest połączeniem 3 tabeli

Tabela „Badań ", która posiada wszystkie dane badawcze

------ TABLE Research------ 
- ResearchID Uniqueidentifier 
- ResearchTitle text 
- PublishedDate 

Tabela«Autor», który przechowuje wszystkie dane wykładowca

------ TABLE Author ------ 
- AuthorID varchar(20) 
- AuthorName vachar(100) 

A Table "ResearchAuthorMapping", które tworzą związek między "badań" i "autora"

------ TABLE ResearchAuthorMapping------ 
- ResearchID uniqueidentifier  
- AuthorID varchar(20) 

Oto moje zapytanie dotychczas

DECLARE @offset int; 
DECLARE @limit int = 3; 
DECLARE @page int = 1 -- CHANGE BY REQUEST 
SET @offset = ((@page - 1) * @limit) + 1; 
SELECT * 
FROM 
(
    SELECT 
     DENSE_RANK() OVER(ORDER BY Research.ResearchTitle DESC) AS num, 
     Research.* 
    FROM 
     Research 
     LEFT JOIN 
      ResearchAuthorMapping ON Research.ResearchID = ResearchAuthorMapping.ResearchID 
     LEFT JOIN 
      Author ON ResearchAuthorMapping.AuthorID = Author.AuthorID 

)TempTable 
WHERE 
    TempTable.num >= @Offset AND TempTable.num < @offset + @limit 

Do tej pory, jestem tylko w stanie osiągnąć ten

PAGE 1 
ID  Research Title  Published Date Author ID Author Name 
1  Research F   2013-5-7   D570   Michael 
1  Research F   2013-5-7   D568   Stan 
1  Research F   2013-5-7   D569   Steve  
2  Research E   2013-5-6   D569   Steve  
3  Research D   2013-5-8   D567   John 

PAGE 2 
ID  Research Title  Published Date Author ID Author Name 
4  Research C   2013-5-8   D570   Michael 
5  Research B   2013-5-9   D569   Steve 
6  Research A   2013-5-10   D567   John 
6  Research A   2013-5-10   D568   Stan 

zestaw wyników, że zamówione przez Research tytułu

Ale, co ja chcę, to dane sortowane według daty wydania, ale coraz identyfikator na podstawie

ResearchTitle/ResearchID grupującego (w moim zapytania i uzyskać identyfikator przy użyciu DENSE_RANK). używać identyfikatora do ograniczenia wynik (paginacji)

* Przepraszam za mój zły język angielski

+2

Witamy w StackOverflow, twoje pytanie jest wspaniałe, dużo kodu, projekt tabeli, przykładowe dane. Którą wersję SQL używasz? Są między nimi pewne różnice. – Yaroslav

+1

Witaj Jarosławiu, dziękuję. Im używam serwera SQL 2008 R2 – Denitri

Odpowiedz

2

I recon można owinąć swoje wyniki w zestawie row_number że re-zlecenia wstępnych wyników. Coś wzdłuż linii:

SELECT * 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY PublishedDate) AS rownum 
        ,A.* 
      FROM  (SELECT DENSE_RANK() OVER (ORDER BY Research.ResearchTitle DESC) AS num 
           ,ResearchID 
           ,PublishedDate 
         FROM  Research) A) B 
LEFT JOIN ResearchAuthorMapping C 
ON  B.ResearchID = C.ResearchID 
LEFT JOIN Author D 
ON  C.AuthorID = D.AuthorID 
WHERE B.rownum >= @Offset 
     AND B.rownum < @offset + @limit 

przeniosłem sprzężeń poza podzapytaniu aby ograniczyć wyszukiwań.

+0

hi souplex. Nie wypróbowałem twojego rozwiązania. źle to wypróbuję JAK NAJSZYBCIEJ, ale widząc twoje rozwiązanie, można bezpiecznie używać 3 zagnieżdżonych zaznaczeń? ponieważ dane im działały były bardzo duże. Dzięki. – Denitri

+0

Nie mogę naprawdę odpowiedzieć na to pytanie Denitri, ponieważ musiałbym wiedzieć o tobie znacznie więcej. Ale ogólnie rzecz biorąc, kiedy twój zbiór danych jest bardzo duży, moja wersja zapytania będzie nieco lżejsza, ponieważ 2 połączenia są stosowane tylko do ograniczonej strony. Funkcja row_number nie jest szczególnie ciężka, ale "order by" może być bardzo kosztowna. – souplex

+0

cześć souplex, zgadzam się, że twoje zapytanie było lżejsze przez wstawienie złączenia na zewnątrz.Ale wypróbowałem twoje rozwiązanie, ale to niestety nie pasuje do mojego celu. powodem, dla którego wstawiłem złączenia w wynik initalu było to, że muszę filtrować dane, które zostały pobrane z tabeli badań (w tabeli zapytań A). Następnie z tego przefiltrowanego wyniku chcę utworzyć podział na strony, dlatego potrzebuję numeru wiersza na podstawie pola ResearchID, więc mogę ograniczyć wynik przy użyciu zewnętrznego warunku (gdzie rownum> = @offset ...) – Denitri

Powiązane problemy