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 只是将 EndValueMultiplier 的前一个值添加到每一行。

第二个 CTE 对检测所需更改的 case 语句进行运行求和。

主语句按运行总和(每次更改都会增加)分组并计算您需要的值。

【讨论】:

【参考方案2】:

@Joachim 击败了我(这个答案比我的要优雅得多),但我还是会发布我的变体。

编辑:对 cme​​ts 中突出显示的错误的一个非常 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语句该怎么写呀?

Java中对数组升序排列用Arrays.sort( )方法,那降序排列用啥方法?

SQL语言中的升序,降序,是怎么会事

求一条sql语句,按照成绩降序排序,并显示名次,如123

MySQL高级SQL语句

SQL里面的排序语句desc和ASC有啥区别