如何按列和下一行排序,并按另一列对它们进行排序?

3
我有一张表格,包含四列:IDisErrorSolidLineHighestError
每一行都与另一行相关联,由SolidLine列确定。因此,表格中有两行相关联。
例如,ID为1和2的行由SolidLine(5)关联。
----------------------------------------------------------------------
|      ID      |    isError     |      SolidLine   |    HighestError
----------------------------------------------------------------------
|       1      |     0          |        5         |     1
|       2      |     0          |        5         |     1
|       3      |     0          |        8         |     1
|       4      |     0          |        8         |     1
|       5      |     1          |        10        |     50 
|       6      |     0          |        10        |     1
|       7      |     1          |        4         |     80
|       8      |     0          |        4         |     1
|       9      |     1          |        7         |     80
|      10      |     0          |        7         |     1
|      11      |     0          |        3         |     1 
|      12      |     0          |        3         |     1
----------------------------------------------------------------------

我希望按照以下条件对表进行排序:
如果isError为1,则按SolidLine的下一行进行排序,然后按HighestError排序。
因此,期望的结果应该如下所示:
----------------------------------------------------------------------
|      ID      |    isError     |      SolidLine   |    HighestError
----------------------------------------------------------------------
|       7      |     1          |        4         |   80
|       8      |     0          |        4         |   1
|       9      |     1          |        7         |   80
|       10     |     0          |        7         |   1
|       5      |     1          |        10        |   50
|       6      |     0          |        10        |   1
|       1      |     0          |        5         |   1
|       2      |     0          |        5         |   1
|       3      |     0          |        8         |   1
|       4      |     0          |        8         |   1
|       11     |     0          |        3         |   1
|       12     |     0          |        3         |   1 
----------------------------------------------------------------------

第一行成为第一行,因为表格 isErrorHighestError 的值最大且等于1。接下来的一行将与 ID = 8 匹配,因为它的 SolidLine 值与 ID = 7 的行相同。 SolidLine 总是成对出现,不取决于 isError 列。
因此,由 SolidLine 绑定的行对应始终保持在一起。
我尝试了以下查询,但结果错误:
--it breaks SolidLine ordering. 
SELECT ID, isError, SolidLine, HighestError
FROM SolidThreads
ORDER BY SolidLine, isError, HighestError desc, id

并且:

SELECT 
ROW_NUMBER() OVER (PARTITION BY SolidLine ORDER BY isError DESC) [RowNumber],
ID, isError, SolidLine, HighestError
FROM SolidThreads
ORDER BY HighestError desc, id

我做错了什么?或者我该怎么做呢?

2
为什么id 7是第一个?你能逐行解释输出吗? - MatBailie
实线对总是在一起吗,还是只有在出现错误时才在一起? - Greg Viers
如果 @MatBailie 的 isError 等于 1,并且表中的HighestError 具有最大值,则下一行将与 ID=8 配对,因为其 SolidLine 值与 ID=7的那一行相同。 - StepUp
@GregViers 因为它们按ID排序,但实际上这并不重要。我需要保留配对,并按isErrorHighestError对它们进行排序。 - StepUp
每一对是否总是共享相同的最高误差? - SQLChao
显示剩余12条评论
3个回答

2
根据您的描述,您可以通过以下方式完成此操作:
  • 添加一个名为“此实线包含错误行”的列
  • 添加一个名为“此实线的最大误差”的列
  • 使用CASE表达式根据错误状态更改排序
http://sqlfiddle.com/#!18/84e7a/1
WITH
  SolidThreadsSummary AS
(
  SELECT
    *,
    MAX(isError     ) OVER (PARTITION BY SolidLine)   AS SolidLineHasError,
    MAX(highestError) OVER (PARTITION BY SolidLine)   AS SolidLineMaxError
  FROM
    SolidThreads
)
SELECT
  *
FROM
  SolidThreadsSummary
ORDER BY
  SolidLineHasError DESC,  -- Not really necessary for your data
  SolidLineMaxError DESC,
  CASE WHEN SolidLineHasError > 0 THEN SolidLine ELSE 1 END,
  isError DESC,
  id

如果ID不总是连续的话(对于不包含错误的配对),这可能会更加健壮一些...

http://sqlfiddle.com/#!18/84e7a/2

WITH
  SolidThreadsSummary AS
(
  SELECT
    *,
    MAX(isError     ) OVER (PARTITION BY SolidLine)   AS SolidLineHasError,
    MAX(highestError) OVER (PARTITION BY SolidLine)   AS SolidLineMaxError,
    MIN(id          ) OVER (PARTITION BY SolidLine)   AS SolidLineMinID
  FROM
    SolidThreads
)
SELECT
  *
FROM
  SolidThreadsSummary
ORDER BY
  SolidLineHasError DESC,
  SolidLineMaxError DESC,
  CASE WHEN SolidLineHasError > 0 THEN SolidLine ELSE 1 END,
  isError DESC,
  SolidLineMinID,
  id
;

1

看起来您想按照SolidLines的顺序进行排序,并首先按组中最高的错误和组中最低的ID进行排序,然后在组内首先显示错误。 假设这是您想要的,我会使用派生表来实现:

ID, isError, SolidLine, HighestError
FROM SolidThreads INNER JOIN
(SELECT SolidLine, MAX(Highesterror) as sorting_HighestError, MIN(ID) as Sorting_Id
    FROM SolidThreads GROUP BY SolidLine) as Sorting_DT
ON Sorting_DT.SolidLine = SolidThreads.SolidLine
ORDER BY sorting_HighestError DESC, Sorting_Id, isError Desc, Id

1
如果每对的ID总是连续的,您可以简单地执行this
SELECT T.*
FROM yourTable T
JOIN (SELECT SolidLine, MAX(HighestError) MaxError
      FROM yourTable
      GROUP BY SolidLine) T2 ON T.SolidLine = T2.SolidLine
ORDER BY MaxError DESC, ID

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接