Na przykład:

Name         Date
A            2018-06-02
B            2018-06-03
B            2018-06-01
C            2018-06-01

Jaki jest najlepszy sposób na uzyskanie:

B            2018-06-03
B            2018-06-01
A            2018-06-02
C            2018-06-01

Kolejność sortowania jest najpierw przez Order by Date DESC, ale następnie powinna przestrzegać wszystkich rekordów dla tego Name

2
LONG 4 czerwiec 2018, 18:19

5 odpowiedzi

Najlepsza odpowiedź

Spróbuj zmusić maksymalną datę według każdej nazwy.

IF OBJECT_ID('tempdb..#Data') IS NOT NULL
    DROP TABLE #Data

CREATE TABLE #Data (
    Name VARCHAR(10),
    Date DATE)

INSERT INTO #Data (
    Name,
    Date)
VALUES
    ('A', '2018-06-02'),
    ('B', '2018-06-03'),
    ('B', '2018-06-01'),
    ('C', '2018-06-01')

SELECT
    D.Name,
    D.Date
FROM
    #Data AS D
ORDER BY
    MAX(D.Date) OVER (PARTITION BY D.Name ORDER BY D.Date DESC) DESC,
    D.Date DESC,
    D.Name
5
EzLo 4 czerwiec 2018, 15:27

Użyj funkcji Okno :

order by count(*) over (partition by name) desc, [date] desc, name

Dla opartych na datę użycia max() zamiast tego

order by max([date]) over (partition by name) desc, [date] desc, name
3
Yogesh Sharma 4 czerwiec 2018, 15:33

Powinno to uzyskać, co chcesz:

WITH VTE AS(
    SELECT [name],
           CONVERT(date,[date]) AS [date] --that isn't confusing
    FROM (VALUES ('A','20180602'),('B','20180603'),('B','20180601'),('C','20180601')) V([Name],[date])),
MaxDate AS (
    SELECT *,
           MAX([date]) OVER (PARTITION BY [name]) AS MaxDate
    FROM VTE)
SELECT [name],[date]
FROM MaxDate
ORDER BY MaxDate DESC,
         [date] DESC,
         [name] ASC;
2
Larnu 4 czerwiec 2018, 15:27

EDYTOWAĆ


Polecam użyć odpowiedzi Exlo. Wysłałem, że skierowałem we właściwym kierunku z funkcjonalnością okna, ale jego wydaje się dokładnie pasować do tego, czego potrzebujesz.


Powinieneś opublikować oczekiwane wyniki i ewentualnie więcej danych testowych, aby uzyskać lepszą odpowiedź.

Bez testów wierzę, że spowoduje to, że uwolni cię dobrą ścieżkę.

Możesz użyć Dense_Rank () over (zamów według daty DESC) jako Daterank i Row_Number () ponad (partycja według nazwy Zamówienie według daty DESC) jako Namidateorder

Jeśli powyższy jest podzewności lub CTE, możesz wybrać z tego i zamówić przez Daterank, Namidateorder

1
Joe C 4 czerwiec 2018, 15:34

Użyj Row_number:

declare @t as table ([Name] char(1), [Date] date)

insert into @t values
  ('A', '2018-06-02')
, ('B', '2018-06-03')
, ('B', '2018-06-01')
, ('C', '2018-06-01')


    Select t.*, row_number() over (order by md desc) as r
    from
    (
        select [Name], max([date]) md
        from @t
        group by [Name]
        ) x
    inner join @t t on t.[Name] = x.[Name]
0
cloudsafe 4 czerwiec 2018, 15:59