重新行号查询

时间:2016-10-05 12:04:10

标签: sql sql-server login duplicates row-number

我有以下要求:

学生和家长登录详细信息需要邮件合并才能发送信件

在我们的数据库中,大多数学生都有单亲联系,很少有2人

我正在撰写一个查询(如下),提供学生和家长的详细信息以及用户名 - 学生ID_1或学生ID_2(取决于父母的人数) 自动生成密码。

我们要做的是,如果学生有单亲,那么只有他们的联系方式需要显示在我的查询中,而不是额外的身份

我正在努力在我的查询中实现这一点,所以非常感谢任何帮助。

SELECT StudID, StudName, RTRIM(StudID) + '_1' AS Parent_Username, CAST(ABS(CHECKSUM(NEWID())) % 10 AS VARCHAR(1))
+ CHAR(ASCII('a') + ABS(CHECKSUM(NEWID())) % 25) + CHAR(ASCII('A') + ABS(CHECKSUM(NEWID())) % 25) + LEFT(NEWID(), 5) AS Parent_Password
FROM
Student

StudId   StudName          Gender Parent Username  Parent Password
09054828 Alexander  Lewis    M     09054828_1       0iCCA086
09054828 Alexander  Lewis    M     09054828_1       6jI247CA
09054828 Alexander  Lewis    M     09054828_1       7xA1075E
09054828 Alexander  Lewis    M     09054828_1       3dFCBCCF
09056750 Daniel O'Sullivan   M     09056750_1       6tC76C96
09057033 Daniel Geggus       M     09057033_1       9gXDB414

And we have Parents Portal table which has below data
StudentID    Name               ParentUsername   ParentPassword 
9054828 Lewis   Alexander          09054828_1       l5oXYQo
9054828 Lewis   Alexander          09054828_2       70AYvbi
9056750 O'Sullivan  Daniel         09056750_1       1OnVMn0
9056750 O'Sullivan  Daniel         09056750_2       rT47Sx5
9057033 Geggus  Daniel             09057033_1       Ap6EV3v
9057033 Geggus  Daniel             09057033_2       Ar4AQ22

所以,一旦我将原始查询加入Parents Portal表,我将在下面看到

   StudentID    Name               ParentUsername   ParentPassword 
09054828 Alexander  Lewis    M     09054828_1       0iCCA086
09054828 Alexander  Lewis    M     09054828_1       6jI247CA
09054828 Alexander  Lewis    M     09054828_1       7xA1075E
09054828 Alexander  Lewis    M     09054828_1       3dFCBCCF
9056750      Daniel O'Sullivan     09056750_1        1OnVMn0
9057033      Daniel Geggus         09057033_1        Ap6EV3v

即使学生有2个父母的成绩加倍(4行而不是2)

任何想法或建议如何限制重复行?

由于 的Ar

1 个答案:

答案 0 :(得分:1)

您可以在公用表表达式或子查询中使用RANK()OVER(PARTITION By StudID order by),然后仅过滤rank = 1.

with query as (
SELECT 
RANK() OVER (PARTITION By StudID  order by <column parent related>)  as rank,
StudID, 
StudName, 
RTRIM(StudID) + '_1' AS Parent_Username, 
CAST(
     ABS(CHECKSUM(NEWID())) % 10 AS VARCHAR(1)) 
    + CHAR(ASCII('a') + ABS(CHECKSUM(NEWID())) % 25) 
    + CHAR(ASCII('A') + ABS(CHECKSUM(NEWID())) % 25) 
    + LEFT(NEWID(), 5) AS Parent_Password
FROM Student)
select StudID,StudName,Parent_Username, Parent_Password from query where rank = 1

有关详细信息,请参阅windows documentation