Каков наилучший способ сортировки ниже результата - PullRequest
0 голосов
/ 04 июня 2018

Например:

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

Как лучше всего получить:

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

Порядок сортировки сначала по Order by Date DESC, но за ним должны следовать все записи длячто Name

Ответы [ 5 ]

0 голосов
/ 04 июня 2018

Использовать номер строки:

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 голосов
/ 04 июня 2018

Попробуйте ввести максимальную дату для каждого имени.

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
0 голосов
/ 04 июня 2018

Использовать Окно Функция:

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

Для основанного на дате использования max() функция вместо

order by max([date]) over (partition by name) desc, [date] desc, name
0 голосов
/ 04 июня 2018

Это должно дать вам то, что вы хотите:

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;
0 голосов
/ 04 июня 2018

РЕДАКТИРОВАТЬ


Я рекомендую использовать ответ ExLo.То, что я написал, было направлено в правильном направлении с функциональностью окна, но, похоже, он точно соответствует вашим потребностям.


Чтобы получить лучший ответ, вы должны опубликовать ожидаемые результаты и, возможно, больше тестовых данных.

Без тестирования, я полагаю, это поможет вам найти правильный путь.

Вы можете использовать Dense_Rank () Over (Order By Date Desc) в качестве DateRank и Row_Number () Over (Partition By Name Order By Date Desc).) As NameDateOrder

Если вышеупомянутое является подзапросом или cte, вы можете выбрать из этого и упорядочить по DateRank, NameDateOrder

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...