【发布时间】:2022-01-20 17:44:04
【问题描述】:
我正在尝试使用 SQL 来选择唯一重复的服务日期,所有记录都包含在一个表中。这是一个示例起始表:
| GroupID | ServiceID | ServiceDate |
|---|---|---|
| A | X | 1/1/2010 |
| A | Y | 1/1/2010 |
| A | Z | 10/1/2010 |
我已经想出了如何找到 2 条具有相同日期的不同记录并将它们放在一行中,但我最终得到了一个有些重复的表,因为它将每条记录与所有其他记录进行比较:
| GroupID | ServiceID1 | ServiceDate1 | ServiceID2 | ServiceDate2 |
|---|---|---|---|---|
| A | X | 1/1/2010 | Y | 1/1/2010 |
| A | Y | 1/1/2010 | X | 1/1/2010 |
我不想要最后一行,因为它本质上是第一行的副本。
关于如何摆脱第二行的任何想法?
这是一些复制代码(这是我的 SQL Fiddle:http://sqlfiddle.com/#!9/537d84)
CREATE TABLE MyTable (
GroupID varchar(255),
ServiceID varchar(255),
ServiceDate Date
);
INSERT INTO MyTable (GroupID, ServiceID, ServiceDate)
VALUES ("A", "X", '2010-01-01'),
("A", "Y", '2010-01-01'),
("A", "Z", '2010-10-01');
SELECT DISTINCT
c1.ServiceID AS ServiceID1, c1.ServiceDate AS ServiceDate1,
c2.ServiceID AS ServiceID2, c2.ServiceDate AS ServiceDate2
FROM MyTable c1 INNER JOIN MyTable c2
ON c1.GroupID = c2.GroupID
WHERE (c1.ServiceID <> c2.ServiceID AND c1.ServiceDate = c2.ServiceDate);
注意:我认为我可以创建 A-B 和 B-A 组合 ID 变量,然后对它们进行 SELECT DISTINCT。不幸的是,这是一个比 MS Access 稍差的 SQL 版本(从技术上讲,我使用 Microsoft.ACE.OLEDB.12.0 连接字符串在 VBA 中编写它),所以没有 CONCAT 函数,也没有 CASE WHEN子句,以及语法效率方面的其他缺陷。
关于如何摆脱第二行的任何想法?
【问题讨论】:
标签: sql ms-access select duplicates ms-access-2010