【问题标题】:SQL Two columns of guids no duplicatesSQL 两列 guid 没有重复
【发布时间】:2016-06-03 20:42:50
【问题描述】:

我正在通过观看 YouTube 来学习 SQL,我正在努力实现以下目标。 我有一个三列的表

Inspection Guid, SensorData Guid, DateTime

我想获取一个包含 Inspection Guid、SensorDataGuid、DateTime 的表格,但没有重复的 Inspection Guid。

来自(为方便起见,我缩短了指南)

6E814118    DA875776    2016-05-25 14:59:17.523
6E814118    BAEB255D    2016-05-25 14:59:17.523
4B7D4E90    BB717852    2016-05-25 14:58:46.260
06BB9435    2321EDD6    2016-05-25 14:58:16.870
06BB9435    D4168F8B    2016-05-25 14:58:16.870
8D9A8502    3EED26BE    2016-05-25 14:57:47.400
5C9AA885    77D342DD    2016-05-25 14:57:15.217
5C9AA885    43DEF213    2016-05-25 14:57:15.217

6E814118    DA875776    2016-05-25 14:59:17.523
4B7D4E90    BB717852    2016-05-25 14:58:46.260
06BB9435    2321EDD6    2016-05-25 14:58:16.870
8D9A8502    3EED26BE    2016-05-25 14:57:47.400
5C9AA885    77D342DD    2016-05-25 14:57:15.217

按日期时间排序。

非常感谢您的帮助。

【问题讨论】:

  • 这里有一个逻辑问题 - 当重复的 InspectionGuid 不同时,您如何决定删除哪个 SensorDataGuid? (例如,InspectionGuid 6E814118 的第一行)
  • 第一个 Inspection / SensorData Guid 对很好。
  • 我不知道为什么具有相同检查 ID 的两行之间的日期时间相同。它们应该略有不同。

标签: sql sql-server stored-procedures guid


【解决方案1】:

使用ROW_NUMBER()根据DATE选择第一个GUID,然后ORDER BY显示。

SELECT *
FROM (
        SELECT [Inspection Guid], 
               [SensorData Guid], 
               [DateTime],
               ROW_NUMBER() OVER (PARTITION BY [Inspection Guid] 
                                  ORDER BY [DateTime] DESC) rn
        FROM YourTable
      ) T
WHERE rn = 1
ORDER BY [DateTime] DESC

【讨论】:

  • 请注意,@Johnny 想要的只有在具有相同检查 Guid 的记录将自动具有相同的 SensorData Guid 和 DateTime 时才有可能。否则,您不能只显示不同的检查指南,因为它将如何决定显示哪些其他数据?
  • @GendoIkari 你说得对,我认为是相同的价值
  • 是的,它仍然重复,你们是对的。我忘了包括我想要前 N 行,因为数据库很大。
  • @Johnny 为什么你的意思是重复?你试过 row_number 版本吗?
  • 感谢上帝,先生。 PARTITION 拼写错误,在 [DateTime], ROW_NUMBER 之后需要有一个逗号。我能弄明白。
【解决方案2】:
WITH duplicates AS
(
    SELECT
        [Inspection Guid],
        [SensorData Guid],
        [DateTime],
        ROW_NUMBER() OVER
        (
            PARTITION BY [Inspection Guid], [DateTime]
            ORDER BY [SensorData Guid]
        ) AS rn
    FROM YourTable
)
SELECT *
FROM duplicates
WHERE rn = 1

[Inspection Guid][DateTime] 2 个字段的分区确保每个日期时间的分区是唯一的。

【讨论】:

    【解决方案3】:

    你想要的实际上是不可能的。

    以这两条记录为例:

    06BB9435    2321EDD6    2016-05-25 14:58:16.870
    06BB9435    D4168F8B    2016-05-25 14:58:16.870
    

    如果您只想显示一次06BB9435,您将如何决定要显示其他哪条数据?您必须决定为每个重复的 GUID 显示哪个日期。如果您想要最近日期和按字母顺序排列最高的 SensorData,那么您可以这样做:

    SELECT [Inspection Guid], MAX([SensorData Guid]), MAX([DateTime])
    FROM YourTable
    GROUP BY [Inspection Guid]
    ORDER BY MAX([DateTime]) DESC
    

    【讨论】:

    • 最近的日期可以完美运行。但我得到列“InspectionSensorData.CreatedTimeStamp”在 ORDER BY 子句中无效,因为它既不包含在聚合函数或 GROUP BY 子句中。
    • @Johnny 抱歉,修正了 ORDER BY 子句。
    • 这真的很接近! MAX 函数似乎干扰了 SensorDataID,选择了具有最大值的 GUID,而不是匹配的时间戳。
    • MAX([SensorData Guid]) 似乎混合了相对于最新 DateTime 独立选择的 SensorDataID。
    猜你喜欢
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2014-01-13
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多