根据SQL中的下一个和上一个记录进行复杂的排序

尼克·N。

这是有关基于SQL中的下一个和上一个记录进行排序的后续问题

但是现在变得更加复杂了,例如:

  1. 如果1个字母与2个字母匹配,我想更改顺序,以便该字母与以下记录匹配。
  2. 如果找不到匹配项,则应按字母正常排序。
  3. 这些ID可能不会成功,并且记录的顺序也不正确。[SQLFiddle演示]

[创建脚本和SQL Fiddle演示]

create table Parent (
id [bigint] IDENTITY(1,2), 
number bigint NOT NULL,
PRIMARY KEY (id)
)
GO

create table Child (
id [bigint] IDENTITY(1,2), 
parentId BIGINT, 
letter VARCHAR(1) NOT NULL,
PRIMARY KEY (id),
UNIQUE (parentId, Letter),
FOREIGN KEY (parentId) REFERENCES Parent(id)
)
GO

DECLARE @ParentIdentity BIGINT

INSERT Parent (number) VALUES (2)
SET @ParentIdentity = @@IDENTITY
INSERT Child (parentId, letter) VALUES (@ParentIdentity, 'C')
INSERT Child (parentId, letter) VALUES (@ParentIdentity, 'B')

INSERT Parent (number) VALUES (3)
SET @ParentIdentity = @@IDENTITY
INSERT Child (parentId, letter) VALUES (@ParentIdentity, 'D')
INSERT Child (parentId, letter) VALUES (@ParentIdentity, 'B')

INSERT Parent (number) VALUES (1)
SET @ParentIdentity = @@IDENTITY
INSERT Child (parentId, letter) VALUES (@ParentIdentity, 'C')
INSERT Child (parentId, letter) VALUES (@ParentIdentity, 'A')
GO

当前查询
当前正在对此查询进行排序:

;WITH CTE AS 
(
SELECT id,ParentID,letter,

ROW_NUMBER() OVER (ORDER BY ID) seq_id,
ROW_NUMBER() OVER (PARTITION BY parentId ORDER BY ID) first_element,
ROW_NUMBER() OVER (PARTITION BY parentId ORDER BY ID DESC) Last_element
FROM Child
), CTE2 AS 
(
SELECT c1.id, c1.parentid, c1.letter, c2.parentid as c2parentid
FROM CTE c1
INNER JOIN CTE c2
ON c1.last_element = 1
AND c2.first_element = 1
AND c1.seq_id + 1 = c2.seq_id
), CTE3 AS 
(
SELECT C.parentid, C.id
FROM CTE2
INNER JOIN child C ON CTE2.c2parentid = C.parentid
AND C.letter = CTE2.letter
)
SELECT P.number, C.letter
FROM Child C
JOIN Parent P ON C.parentId = P.id
LEFT JOIN CTE3 ON CTE3.id = C.id
ORDER BY P.number, ISNULL(CTE3.id,0) DESC, C.letter

当前结果集

number               letter
-------------------- ------
1                    A
1                    C
2                    B
2                    C
3                    B
3                    D

预期结果集
为了阐明我的实际意图,以下是预期结果集:

number               letter
-------------------- ------
1                    A
1                    C
2                    C 
2                    B 
3                    B
3                    D

其他要求和问题

  • 它必须在SQL Server 2005中工作
  • 有一种情况,每个数字使用3个字母,如果它只使用最佳匹配,我会感到高兴。

谁能为我指出如何应对这种情况的正确方向?

A

如果我理解您的要求正确,那么您有的某些部分,parentId并且您希望每个部分都以letters在上一部分中开始,以sletter在下一部分中结束,如果是,请尝试以下操作:

;WITH t AS (
    SELECT 
        c.id, 
        c.parentId,
        c.letter,
        dt.parentSeq
    FROM 
        Child c 
        JOIN (
        SELECT 
            ci.parentId, ROW_NUMBER() OVER (ORDER BY p.number) parentSeq
        FROM 
            Child ci
            JOIN
            Parent p ON ci.parentId = p.id
        GROUP BY
            ci.parentId, p.number) dt ON c.parentId = dt.parentId
)
SELECT
    p.number,
    t.letter
FROM 
    t
    JOIN
    Parent p ON t.parentId = p.id
ORDER BY
    p.number,
    CASE WHEN t.letter IN (SELECT ti.letter FROM t ti WHERE ti.parentSeq = t.parentSeq - 1) THEN 0 
        WHEN t.letter IN (SELECT ti.letter FROM t ti WHERE ti.parentSeq = t.parentSeq + 1) THEN 2 
        ELSE 1 END,
    t.letter

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

根据SQL中的下一个和上一个记录排序

来自分类Dev

获取同一查询中的下一个和上一个记录

来自分类Dev

Laravel上一个和下一个记录

来自分类Dev

学说-获取下一个和上一个记录

来自分类Dev

Laravel上一个和下一个记录,返回对象

来自分类Dev

根据上一个和下一个值拆分和枚举 R 中的序列元素

来自分类Dev

根据上一个和下一个值过滤熊猫数据框

来自分类Dev

根据视图获取下一个和上一个MySQL ID

来自分类Dev

在页面中获取ssrs报告中的上一个,当前和下一个记录

来自分类Dev

LINQ,获取表中的下一个和上一个记录(我很困惑)

来自分类Dev

使用下一个和上一个按钮在VC中显示排序的句子

来自分类Dev

根据R中的上一个和下一个值设置值的条件

来自分类Dev

依靠上一个和下一个元素进行流处理

来自分类Dev

根据与上一个和下一个项目的关系进行迭代时从列表中删除项目

来自分类Dev

如何通过查看每行中的上一个和下一个值进行分组

来自分类Dev

SQL查询以获取最近的上一个和下一个日期?

来自分类Dev

在js数组中查找下一个和上一个键

来自分类Dev

分页-jQuery DataTables中的上一个和下一个大小按钮

来自分类Dev

列表中的Python Compare元素与上一个和下一个

来自分类Dev

FullCalendar中的“上一个”和“下一个”按钮产生“关闭”消息

来自分类Dev

在Elasticsearch中按日期获取上一个和下一个文档

来自分类Dev

如何获取数组中的下一个和上一个元素,Ruby

来自分类Dev

比较Pandas列中的上一个和下一个不同的值

来自分类Dev

选择字符串中的上一个和下一个单词

来自分类Dev

在Jekyll中循环上一个和下一个帖子

来自分类Dev

抓取数组中的上一个和下一个元素

来自分类Dev

如何从日期变量中查找下一个和上一个日期

来自分类Dev

更改datepicker插件中的下一个和上一个按钮的位置

来自分类Dev

图库中的下一个和上一个按钮

Related 相关文章

  1. 1

    根据SQL中的下一个和上一个记录排序

  2. 2

    获取同一查询中的下一个和上一个记录

  3. 3

    Laravel上一个和下一个记录

  4. 4

    学说-获取下一个和上一个记录

  5. 5

    Laravel上一个和下一个记录,返回对象

  6. 6

    根据上一个和下一个值拆分和枚举 R 中的序列元素

  7. 7

    根据上一个和下一个值过滤熊猫数据框

  8. 8

    根据视图获取下一个和上一个MySQL ID

  9. 9

    在页面中获取ssrs报告中的上一个,当前和下一个记录

  10. 10

    LINQ,获取表中的下一个和上一个记录(我很困惑)

  11. 11

    使用下一个和上一个按钮在VC中显示排序的句子

  12. 12

    根据R中的上一个和下一个值设置值的条件

  13. 13

    依靠上一个和下一个元素进行流处理

  14. 14

    根据与上一个和下一个项目的关系进行迭代时从列表中删除项目

  15. 15

    如何通过查看每行中的上一个和下一个值进行分组

  16. 16

    SQL查询以获取最近的上一个和下一个日期?

  17. 17

    在js数组中查找下一个和上一个键

  18. 18

    分页-jQuery DataTables中的上一个和下一个大小按钮

  19. 19

    列表中的Python Compare元素与上一个和下一个

  20. 20

    FullCalendar中的“上一个”和“下一个”按钮产生“关闭”消息

  21. 21

    在Elasticsearch中按日期获取上一个和下一个文档

  22. 22

    如何获取数组中的下一个和上一个元素,Ruby

  23. 23

    比较Pandas列中的上一个和下一个不同的值

  24. 24

    选择字符串中的上一个和下一个单词

  25. 25

    在Jekyll中循环上一个和下一个帖子

  26. 26

    抓取数组中的上一个和下一个元素

  27. 27

    如何从日期变量中查找下一个和上一个日期

  28. 28

    更改datepicker插件中的下一个和上一个按钮的位置

  29. 29

    图库中的下一个和上一个按钮

热门标签

归档