SQL Server 如何在列中取单个值取决于两列

jgovgodb  于 2023-01-12  发布在  其他
关注(0)|答案(2)|浏览(144)

我正在使用SQL Server,我有这样的表:
| 身份证|大小|统治|
| - ------|- ------|- ------|
| 1个|大型|利雅得|
| 1个|小|利雅得|
| 第二章|大型|麦加|
| 第二章|培养基|麦加|
| 第二章|小|吉达|
| 三个|培养基|达曼|
我希望查询对每个reake和id只采用一个大小。例如,在id“1”中,我希望删除第二个值(“small”)注意:我不能在表中修改或更改。
结果应该是这样的:
| 身份证|大小|统治|
| - ------|- ------|- ------|
| 1个|大型|利雅得|
| 第二章|大型|麦加|
| 第二章|小|吉达|
| 三个|培养基|达曼|

jei2mxaa

jei2mxaa1#

假设您希望按此顺序对大型、中型和小型进行优先级排序,我们可以尝试使用ROW_NUMBER,如下所示:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY id, reign
                                 ORDER BY CASE size WHEN 'large'  THEN 1
                                                    WHEN 'medium' THEN 2
                                                    WHEN 'small'  THEN 3 END) rn
    FROM yourTable
)

SELECT id, size, reign
FROM cte
WHERE rn = 1
ORDER BY id;
ejk8hzay

ejk8hzay2#

如果您的数据总是采用这种简单的形式(意味着只有这三种大小),并且if您总是希望选择large first if present,else medium first if present和last small,这可以通过使用MINGROUP BY以及一个好的ORDER BY子句来实现:

SELECT id, MIN(size) AS size, reign
FROM yourtable
GROUP BY id, reign
ORDER BY id, size;

此查询将准确地生成问题中显示的结果。
在此验证:db<>fiddle
如果此逻辑不足以满足您的要求,请编辑您的问题并更详细地解释您需要什么。

相关问题