例如:
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
的所有记录
答案 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]