在一个列上选择唯一的值,返回多个其他列(SQL Server)

23 浏览
0 Comments

在一个列上选择唯一的值,返回多个其他列(SQL Server)

我正在尝试编写一个查询,从GPSReport表中返回每个唯一设备的最新GPS位置。表中有50个设备,所以我只想返回50行。

以下是我目前的查询(不起作用):

SELECT TOP(SELECT COUNT(DISTINCT device_serial) FROM GPSReport) * FROM GPSReport AS G1
RIGHT JOIN
(SELECT DISTINCT device_serial FROM GPSReport) AS G2
ON G2.device_serial = G1.device_serial
ORDER BY G2.device_serial, G1.datetime DESC

这返回了50行,但没有为每个device_serial返回唯一的行。它返回了第一个设备的所有报告,然后是第二个设备的所有报告,依此类推。

在一个查询中能实现我想做的吗?

0
0 Comments

在SQL Server中,当我们需要从一个表中选择某一列的唯一值,并返回该列对应的其他多列时,可以使用SELECT DISTINCT语句。然而,有时候我们会遇到一个问题,即SELECT DISTINCT只能作用于一个列,并且无法返回其他列的值。

出现这个问题的原因是,当我们使用SELECT DISTINCT语句时,它只会去除指定列中的重复值,并不能保证其他列的唯一性。因此,如果我们在一个表中有多个相同的device serial number,并且我们想要返回每个device serial number对应的其他列的值,就会出现问题。

解决这个问题的方法是使用RIGHT JOIN语句。当我们使用RIGHT JOIN时,如果在表GPSReport中的device serial number列中有多条记录,它将获取所有这些记录,并将其连接到从SELECT DISTINCT device_serial FROM GPSReport语句中收到的唯一列表。

以下是解决这个问题的示例代码:

SELECT DISTINCT G.device_serial, G.column1, G.column2
FROM GPSReport G
RIGHT JOIN (
    SELECT DISTINCT device_serial
    FROM GPSReport
) AS T
ON G.device_serial = T.device_serial

上述代码中,我们首先使用子查询SELECT DISTINCT device_serial FROM GPSReport得到一个包含唯一device serial number的列表。然后,我们将这个子查询作为右连接的一部分,并将其与表GPSReport中的其他列进行连接。这样,我们就可以返回每个device serial number对应的其他列的值。

通过使用RIGHT JOIN语句,我们可以解决在SELECT DISTINCT中只能作用于一个列,并且无法返回其他列的值的问题。这样,我们可以获取每个唯一的device serial number对应的其他列的值,并得到我们想要的结果。

0
0 Comments

问题的出现原因:

这个问题的出现是因为在使用SELECT DISTINCT时,只返回了一个列的唯一值,但是需要返回多个其他列的值。

解决方法:

可以通过使用子查询来解决这个问题。子查询返回device_serial列的最大datetime值,并按device_serial进行分组。

然后将这个子查询与原表GPSReport进行连接,连接条件是device_serial和mostrecent(datetime)相等。

最后按照device_serial进行排序。

代码如下:

SELECT * FROM
GPSReport AS G1
JOIN (SELECT device_serial, max(datetime) as mostrecent 
      FROM GPSReport group by device_serial) AS G2
ON G2.device_serial = G1.device_serial and g2.mostrecent = g1.datetime
ORDER BY G1.device_serial

0
0 Comments

在SQL Server中,有时我们需要从一个表中选择某一列的唯一值,并返回其他多个列的值。然而,SQL Server并没有直接支持这样的功能。因此,我们需要找到一种解决方法来实现这个需求。

以上的代码提供了一种解决方法。首先,我们使用ROW_NUMBER()函数对指定的列进行分组和排序,然后将结果作为一个子查询命名为DEDUPE。在子查询中,ROW_NUMBER()函数会为每个分组中的记录分配一个行号,按照指定的列的值进行排序。

接下来,我们从DEDUPE子查询中选择所有的列,并使用WHERE条件过滤出行号为1的记录。这样就实现了按照指定列的唯一值返回其他多个列的值。

这种方法的原理是通过ROW_NUMBER()函数来标记每个分组的第一行,并将其行号设置为1。然后我们可以根据这个行号来选择我们想要的记录。

这个解决方法非常巧妙和高效,可以满足我们在SQL Server中选择某一列的唯一值并返回其他多个列的需求。感谢以上提供解决方法的回答者,他们的回答非常出色,对我们的问题给予了很好的解答和指导。

0