排序结果的最佳方法是什么?

时间:2018-06-04 15:19:49

标签: sql sql-server tsql

例如:

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 :(得分:5)

尝试按每个名称强制最大日期。

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

答案 1 :(得分:3)

使用窗口功能:

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

基于日期,请使用max()函数

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

答案 2 :(得分:2)

这可以让你得到你想要的东西:

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;

答案 3 :(得分:1)

修改

我建议您使用ExLo的答案。我发布的内容是朝向正确的方向,具有窗口功能,但他似乎完全符合您的需求。

您应该发布预期结果和可能更多的测试数据,以获得更好的答案。

如果不进行测试,我相信这会让你走上一条好路。

你可以使用Dense_Rank()Over(按日期排序说明)作为DateRank和Row_Number()Over(按名称排序按日期描述)作为NameDateOrder

如果以上是子查询或cte,您可以从中选择并按DateRank,NameDateOrder

进行排序

答案 4 :(得分:0)

使用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]