我有以下查询打印出一个数字列表。我想将每个唯一编号限制为1。
例如,如果数据库中有三个18,它将打印出18,18,18,如果它们是两次出现的5,它将打印出5,5。在这种情况下,我只能看到18和5。
let sqlSelectBoxInformation = "SELECT longestDimension from box ";
connectionBoxInformation.query(sqlSelectBoxInformation, function(err, rows, fields) {
if (!err) {
// Check to see if the user entered hashtag is found in the database
// Create a variable to track if the item was found
var data = {
rows: rows,
userHashtag: databaseHashtag
}
res.render('delivery/chooseBox', data);
}
});
答案 0 :(得分:2)
您可以使用DISTINCT
:
SELECT DISTINCT longestDimension from box
或GROUP BY
SELECT longestDimension from box GROUP BY longestDimension
答案 1 :(得分:1)
请注意,DISTINCT
始终适用于所有返回的列。将括号括在一列中对其行为没有影响。
如果您希望结果在处理longestDimension
或多列时仅包含subquery
的唯一值,则可以使用GROUP BY
子句 - 但是您必须决定一些要在其他列中返回值的规则。您可以使用MIN()
,MAX()
,COUNT()
,SUM()
等汇总函数来执行此操作。
简化示例:
SELECT SG.SGID,
MIN(SG.START_TIME), --the lowest start time for this sgid.
COUNT(DISTINCT en.EnrollmentID) --the unique enrollments for this sgid.
FROM StudentGroups SG
INNER JOIN Enrollments EN ON SG.SGID = EN.SGID
GROUP BY SG.SGID;
(对于上下文SG
,这里代表StudentGroup
。)在原始查询中连接多个表时,在计算和求和时必须小心,因为连接中的重复项可以为您提供结果不正确。
另一种选择是使用ROW_NUMBER()
为每个SGID
返回一行:
SELECT * FROM (
SELECT SG.SGID,
SG.START_TIME,
en.EnrollmentID,
ROW_NUMBER() OVER (PARTITION BY SGID ORDER BY SG.START_TIME) as RN
FROM StudentGroups SG
INNER JOIN Enrollments EN ON SG.SGID = EN.SGID
)
WHERE RN = 1;
这为每个SGID
的行编号,从1开始,并按SG.START_TIME
的值排序。它将返回每行SGID
的最早开始时间的一行。如果多行具有相同的开始时间,则会随机选择其中任何一行,或多或少。您可以向ORDER BY
子句添加更多字段,以进一步定义返回的行。