gpt4 book ai didi

sql - 获取不同的代码名称对,但对其他列进行排序

转载 作者:行者123 更新时间:2023-12-02 21:57:40 24 4
gpt4 key购买 nike

我对编写查询有点困惑(SQL 不是我的强项)。

假设我有以下 TABLE1 :

CODE NAME     SCOPE1  SCOPE2    SEQ
------------------------------------
A a Here 1
B b Here 2
C c Here 3
C    c            Room      1
A aa Room 2
B bbb Room 3

业务 key 是CODE + SCOPE1 + SCOPE2 ,其中SCOPE1SCOPE2总是相互排斥的。

如何获得 CODE 的不同结果和NAME鉴于我需要按 SCOPE1 排序, SCOPE2 ,和SEQ

也就是说,给定 SCOPE1 = 'Here'SCOPE2 = 'Room' ,我想得到这个结果:

CODE NAME
---------
A a
B b
C c
A aa
B bbb

注:C c来自Room不需要,因为它与 C c 重复。来自Here .

我确实意识到使用 DISTINCT 的局限性与 ORDER BY我能想到的最好的办法如下:

select distinct CODE, NAME from
(
select CODE, NAME from MYTABLE
where (SCOPE1='Here' or SCOPE2='Room')
order by SCOPE1, SCOPE2, SEQ
);

上面生成了正确的对,但顺序错误。我试着乱搞 GROUP BY ,但我想我还不够了解。

我必须坚持使用标准 SQL(也就是说,没有特定于产品的 SQL 结构,除非是 Oracle,也许),而且我猜对于这个特定的查询,可能无法避免子选择。

如果有任何指点,我将不胜感激。提前致谢。

更新:我已经更新了数据集,并根据 petterm 的答案,这是我到目前为止所得到的:sqlfiddle 。当我开始调整序列时,MIN/MAX 技巧不起作用。

假设我将始终搜索一个特定的 SCOPE1与一个特定的 SCOPE2 配对。但我需要全部SCOPE1出现在 SCOPE2 之前的记录。这个想法是我不在乎是否 CODE + NAME来自SCOPE1SCOPE2 - 我只想要按 SCOPE1 排序的唯一对, SCOPE2 ,和SEQ .

最佳答案

更新基于您对 Oracle 的更新要求

SELECT CODE, NAME
FROM
(
SELECT CODE, NAME,
ROW_NUMBER() OVER (ORDER BY SCOPE1, SCOPE2, SEQ) rnum
FROM Table1
WHERE SCOPE1='Here'
OR SCOPE2='Room'
) q
GROUP BY CODE, NAME
ORDER BY MIN(rnum)

这里是SQLFiddle

使其在 SQL Server 中以相同的方式工作

SELECT CODE, NAME
FROM
(
SELECT CODE, NAME,
ROW_NUMBER() OVER (ORDER BY CASE WHEN SCOPE1 IS NULL
THEN 1 ELSE 0 END, SCOPE1,
CASE WHEN SCOPE2 IS NULL
THEN 2 ELSE 3 END, SCOPE2, SEQ) rnum
FROM Table1
WHERE SCOPE1='Here'
OR SCOPE2='Room'
) q
GROUP BY CODE, NAME
ORDER BY MIN(rnum)

这里是SQLFiddle

输出:

| CODE | NAME |---------------|    A |    a ||    B |    b ||    C |    c ||    A |   aa ||    B |  bbb |

Original answer: The only thing I could think of based on your description of requirements

SELECT CODE, NAME
FROM Table1
WHERE SCOPE1='Here'
OR SCOPE2='Room'
GROUP BY CODE, NAME
ORDER BY MIN(SCOPE1), MIN(SCOPE2), MIN(SEQ)

这里是SQLFiddle 演示(MySql)
这是SQLFiddle 演示(SQL Server)
这是SQLFiddle 演示(Oracle)

现在在 MySql 和 SQL Server 中 NULL默认情况下先走,因此您会得到

| CODE | NAME |---------------|    B |  bbb ||    A |    a ||    B |    b ||    C |    c |

在 Oracle 中 NULL默认情况下,s 排在最后,因此您会得到

| CODE | NAME |---------------|    A |    a ||    B |    b ||    C |    c ||    B |  bbb |

关于sql - 获取不同的代码名称对,但对其他列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17474022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com