如何根据另一个表中的索引序列对列中的名称进行排序?

Posted

技术标签:

【中文标题】如何根据另一个表中的索引序列对列中的名称进行排序?【英文标题】:How to order names in a column based on an index sequence in another table? 【发布时间】:2021-01-08 21:24:40 【问题描述】:

所以我有 3 个表 FriendsStudents,它们都有一个 ID 列。但在 Friends 表中,还有一个称为 Friend_ID 的列。我想按照 Friend_ID 的排序方式重新排序 Friends 中的 Name 列。有可能吗?

这是针对问题的 - https://www.hackerrank.com/challenges/placements/problem?isFullScreen=false

注意:我想使用这个 没有 ORDER BY 子句,因为这将是一个子查询。

我在 SQL Server 中的查询。

WITH 
    CTE (NID,N_Name,N_Salary,FID) AS
    (SELECT S.ID AS NID, S.Name AS N_Name, P.Salary AS N_Salary, F.Friend_ID AS FID 
     FROM Students S JOIN Friends F
     ON S.ID = F.ID JOIN Packages P 
     ON S.ID = P.ID),
     
     
--SELECT L.NID,L.N_Name,L.N_Salary,L.FID,R.FN_Sal
SELECT 
   IIF(L.N_Salary > R.FN_Sal,
       IIF(L.FID IN (SELECT ID FROM Students WHERE Students.ID=R.N_ID),L.N_Name,"No val")
    ,NULL)

FROM CTE L
JOIN 
    (SELECT F.ID AS N_ID, P.Salary AS FN_Sal, F.Friend_ID AS F_ID 
     FROM Friends F JOIN Packages P ON F.Friend_ID = P.ID) R
ON L.NID = R.N_ID

我猜我的查询有问题。这绝对不是一个优雅的解决方案,但我只是在尝试一个想法。任何意见都会非常有帮助,在此先感谢。

【问题讨论】:

因为问题有点朦胧,能否提供一张表格,说明你想要达到的效果? 好的,我将对问题进行编辑。请参阅@Giannis,我正在尝试将此查询用作另一个查询中的子查询。因此我不想使用 ORDER BY 子句。这是针对 Hackerrank 问题的。 【参考方案1】:

您必须将Students 加入FriendsPackages 的2 个副本。 第一份Packages返回学生工资,第二份返回朋友工资:

SELECT s.Name
FROM Students s
INNER JOIN Friends f ON f.ID = s.ID
INNER JOIN Packages ps ON ps.ID = s.ID
INNER JOIN Packages pf ON pf.ID = f.Friend_ID
WHERE pf.Salary > ps.Salary
ORDER BY pf.Salary

请参阅demo。 结果:

> | Name     |
> | :------- |
> | Samantha |
> | Julia    |
> | Scarlet  |

【讨论】:

【参考方案2】:

这是问题的一个答案:

DECLARE @Friends TABLE (ID int, Friend_ID INT);
DECLARE @Students TABLE (ID int, Name VARCHAR(100));
DECLARE @Packages TABLE (ID int, Salary DECIMAL(4,2));

INSERT INTO @Friends SELECT ID,Friend_ID FROM (VALUES(1,2),(2,3),(3,4),(4,1)) Friends(ID,Friend_ID);
INSERT INTO @Students SELECT ID,[Name] FROM (VALUES(1,'Ashley'),(2,'Samantha'),(3,'Julia'),(4,'Scarlet')) Students(ID,[Name]);
INSERT INTO @Packages SELECT ID,Salary FROM (VALUES (1,15.20),(2,10.06),(3,11.55),(4,12.12)) Packages(ID,Salary);

WITH StudentPackage AS (
    SELECT
        Student.ID,
        Student.[Name] StudentName,
        Packages.Salary,
        BestFriend.Friend_ID 
    FROM @Students Student
    JOIN @Packages Packages
    ON Student.ID = Packages.ID
    JOIN @Friends BestFriend
    ON Student.ID = BestFriend.ID
)
SELECT
    Student.StudentName
FROM StudentPackage Student
JOIN StudentPackage BestFriend
ON Student.Friend_ID = BestFriend.ID AND BestFriend.Salary > Student.Salary
ORDER BY BestFriend.Salary

【讨论】:

所以想法是做一个CT exp。然后与上一个表(在 CTE 中使用)进行连接? 我认为这是解决您问题的一种方法,但如果您发布整个问题会更容易。 hackerrank.com/challenges/placements/problem?isFullScreen=false 这是问题所在。我知道我的方法并不简单,而是有点太复杂了。但我还是想看看有没有可能。 我已经更新了我的答案。我认为这是解决问题的一种方法。 嘿@Andreas,谢谢!这比我的方法更简单。【参考方案3】:

您是否考虑过使用 Order by 子句。应该可以的。

【讨论】:

我使用了 Order By 子句,但我想使用其他东西,因为我想在子查询中使用它。 更多评论【参考方案4】:

感谢您的所有投入!他们是正确的,我看到我把这么简单的问题复杂化了是多么不必要。

根据我的逻辑,这是我试图实现的解决方案:

WITH 
    CTE (N_ID,N_Name,N_Salary,FID) AS
    (SELECT S.ID AS N_ID, S.Name AS N_Name, P.Salary AS N_Salary, F.Friend_ID AS FID 
     FROM Students S JOIN Friends F
     ON S.ID = F.ID JOIN Packages P 
     ON S.ID = P.ID)
     
     
SELECT L.N_Name
FROM CTE L
JOIN 
    (SELECT F.ID AS N_ID, P.Salary AS FN_Sal, F.Friend_ID AS F_ID 
     FROM Friends F JOIN Packages P ON F.Friend_ID = P.ID) R
ON L.N_ID = R.N_ID
WHERE R.FN_Sal > L.N_Salary
ORDER BY R.FN_Sal;

【讨论】:

以上是关于如何根据另一个表中的索引序列对列中的名称进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中对列中的序号进行编号

对列中的数据进行排序[重复]

有没有办法根据熊猫中的唯一值对列进行排序?

对列值进行排序以匹配另一个表列中值的顺序

pandas笔记:根据列索引名称/行索引名称 对列重新排序

excel:根据另一列中的顺序对十进制值列表进行排序