sql 升序降序排列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 升序降序排列相关的知识,希望对你有一定的参考价值。
参考技术A降序:SELECT*FROMkcORDER BY cpbhDESC
升序:SELECT*FROMkcORDER BY cpbh ASC
语法:
sql可以根据字段进行排序,其中,DESC表示降序,ASC表示升序
orderby字段名 DESC;按照字段名降序排序
orderby字段名ASC;按照字段名升序排序
实例:
一、/*查询学生表中姓名、学号,并以学号降序排序*/
selectname,StuIDfromStudents_informationorderbyStuIDdesc /**orderby以什么排序,默认为升序,desc是降序*/
二、/*查询学生表中前5名学生的姓名,学号,并以学号升序排列*/
selecttop5name,StuIDfromStudents_informationorderbyStuID /*orderby默认为升序*/
扩展资料:
一、ORDERBY语句
ORDERBY语句用于根据指定的列对结果集进行排序。
ORDERBY语句默认按照升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用DESC关键字。
二、SQL排序多个字段
orderby多个字段,每个字段后面都有排序方式,默认ASC
例如:selecttableaorderbya.time1,a.time2desc,a.time3asc
参考资料:w3school-SQLORDERBY子句
在 SQL 第 2 部分中以破坏序列升序/降序对结果最小值/最大值进行分组
【中文标题】在 SQL 第 2 部分中以破坏序列升序/降序对结果最小值/最大值进行分组【英文标题】:Grouping Result Min/Max in a breaking series ascending/descending order in SQL part 2 【发布时间】:2016-03-22 06:57:19 【问题描述】:如果序列破坏了数据顺序,我想在升序/降序序列中选择最小值和最大值
假设我有按 DateTime 顺序排列的数据:
LogDate StartValue EndValue Multiplier DiffValue
2016-02-08 7661.25 7677.62 6.94 16.37
2016-02-09 7677.62 7693.02 6.94 15.4
2016-02-10 7693.02 7709.82 6.94 16.8
2016-02-11 7709.82 7727.08 6.94 17.26
2016-02-12 7727.08 7740.93 6.94 13.85
2016-02-13 3.02 12.22 6.94 9.2
2016-02-14 12.22 20.73 6.94 8.51
2016-02-15 20.73 37.04 6.94 16.31
2016-02-16 37.04 52.56 7 15.52
2016-02-17 52.56 67.82 7 15.26
2016-02-18 67.82 83.66 7 15.84
2016-02-19 83.66 98.77 7 15.11
2016-02-20 98.77 108.37 7 9.61
我想要这样的结果:
LogDateMin LogDateMax StartValue EndValue Multiplier SumOfDiffValue
2016-02-08 2016-02-12 7661.25 7740.93 6.94 79.68
2016-02-13 2016-02-15 3.02 37.04 6.94 34.02
2016-02-16 2016-02-20 37.04 108.37 7 71.34
这里我也按 Multiplier 对结果进行分组并得到 deffValue 的总和
我们怎样才能做到这一点
请帮忙
【问题讨论】:
嗨,您是如何在按乘数对结果进行分组时获得 3 行的。 (可用值仅 6.94 和 7) 我还需要对 startValue/EndValue 从上一个值重置/向下的结果进行分组 什么版本的 SQL Server? @Abhinandan 请注意,Les 接受的答案可能需要与分组相关的修复(如果我正确理解问题)。请参阅答案下的评论。 你真的应该接受@joachim 的回答,他是第一个,看来我的有一个错误(我会在某个时候修复) 【参考方案1】:对于 SQL Server 2012 及更高版本,您可以使用 LAG
找出更改并按此分组。这是一种方式;
WITH cte AS (
SELECT LogDate, StartValue, EndValue, Multiplier, DiffValue,
LAG(EndValue) OVER (ORDER BY LogDate) OldEndValue,
LAG(Multiplier) OVER (ORDER BY LogDate) OldMultiplier
FROM myTable
), cte2 AS (
SELECT LogDate, StartValue, EndValue, Multiplier, DiffValue,
SUM(CASE WHEN OldEndValue > StartValue OR Multiplier <> OldMultiplier
THEN 1 ELSE 0 END) OVER (ORDER BY LogDate) grp
FROM cte
)
SELECT MIN(LogDate) LogDateMin, MAX(LogDate) LogDateMax, MIN(StartValue) StartValue,
MAX(EndValue) EndValue, MAX(Multiplier) Multiplier, SUM(DiffValue) DiffValue
FROM cte2
GROUP BY grp
ORDER BY MIN(LogDate);
第一个 CTE 只是将 EndValue
和 Multiplier
的前一个值添加到每一行。
第二个 CTE 对检测所需更改的 case 语句进行运行求和。
主语句按运行总和(每次更改都会增加)分组并计算您需要的值。
【讨论】:
【参考方案2】:@Joachim 击败了我(这个答案比我的要优雅得多),但我还是会发布我的变体。
编辑:对 cmets 中突出显示的错误的一个非常 hacky 的修复 :)
CREATE TABLE #Test (
LogDate DATE,
StartValue DECIMAL(6,2),
EndValue DECIMAL(6,2),
Multiplier DECIMAL(3,2),
DiffValue DECIMAL(4,2)
);
INSERT INTO #Test(
LogDate
,StartValue
,EndValue
,Multiplier
,DiffValue
)
VALUES
('2016-02-08', 7661.25, 7677.62, 6.94, 16.37),
('2016-02-09', 7677.62, 7693.02, 6.94, 15.4),
('2016-02-10', 7693.02, 7709.82, 6.94, 16.8),
('2016-02-11', 7709.82, 7727.08, 6.94, 17.26),
('2016-02-12', 7727.08, 7740.93, 6.94, 13.85),
('2016-02-13', 3.02, 12.22, 6.94, 9.2),
('2016-02-14', 12.22, 20.73, 6.94, 8.51),
('2016-02-15', 20.73, 37.04, 6.94, 16.31),
('2016-02-16', 37.04, 52.56, 7, 15.52),
('2016-02-17', 52.56, 67.82, 7, 15.26),
('2016-02-18', 67.82, 83.66, 7, 15.84),
('2016-02-19', 83.66, 98.77, 7, 15.11),
('2016-02-20', 98.77, 108.37, 7, 9.61),
--Extra data
('2016-02-21', 120, 150, 6.94, 30),
('2016-02-22', 150, 180, 6.94, 30),
('2016-02-24', 150, 180, 7, 30),
('2016-02-25', 180, 200, 7, 30);
WITH A AS(
SELECT *,
CASE WHEN
StartValue < LAG(StartValue) OVER (PARTITION BY Multiplier ORDER BY LogDate)
OR DATEADD(DAY, -1, LogDate) > LAG(LogDate) OVER (PARTITION BY Multiplier ORDER BY LogDate)
THEN 1 ELSE 0 END AS grp
FROM #Test
)
,B AS(
SELECT *,
SUM(grp) OVER (PARTITION BY A.Multiplier ORDER BY A.LogDate ROWS UNBOUNDED PRECEDING) SUM FROM A
)
,C AS (
SELECT *,
DENSE_RANK() OVER (ORDER BY (CONVERT(VARCHAR(8), Multiplier)+' '+CONVERT(VARCHAR(1),sum))) rnk
FROM B
)
SELECT MIN(LogDate) LogDateMin
,MAX(LogDate) LogDateMax
,MIN(StartValue) StartValue
,MAX(EndValue) EndValue
,MIN(Multiplier) Multiplier
,SUM(DiffValue) SumOfDiffValue
FROM C GROUP BY Rnk
LogDateMin LogDateMax StartValue EndValue Multiplier SumOfDiffValue
---------- ---------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
2016-02-08 2016-02-12 7661.25 7740.93 6.94 79.68
2016-02-13 2016-02-15 3.02 37.04 6.94 34.02
2016-02-21 2016-02-22 120.00 180.00 6.94 60.00
2016-02-16 2016-02-20 37.04 108.37 7.00 71.34
2016-02-24 2016-02-25 150.00 200.00 7.00 60.00
【讨论】:
您可能想要修复的一件事是,如果您为 2016-02-21 添加一行,乘数为 6.94(并且起始值大于 108.37),它将与从 13 开始的范围合并:th 并与从 16 日开始的范围重叠。我假设它不应该(我会添加一个 SQLfiddle,但 SQL Server 2014 似乎在那里坏了) SQLfiddle,注意 21'st 应该是它自己的组。 谢谢@joachim 我去看看以上是关于sql 升序降序排列的主要内容,如果未能解决你的问题,请参考以下文章
mssql指定的ID排在最前面,剩余的按照降序排列。sql语句该怎么写呀?