MS SQL Advanced选择已交换的内容

时间:2016-05-12 09:41:31

标签: sql sql-server select where

我的问题是我需要找到两家公司之间交换超过2次的客户,所以:

我们有公司A和B与Ids,例如1和2。 客户端已从公司A交换到B,它已记录到另一个表历史记录。

现在我需要选择从A公司到B公司从B公司换到A,然后再从A公司换到B公司(最后两个掉期)的客户

我需要说我不知道​​该怎么做。有任何想法吗? 非常感谢你的每一个答案。

编辑:

@jarlh示例:

Table Clients
ID        Name       CompanyId
1         Pikachu     63
2         Mew          34
3         Reptide     63

表历史

ID   ClientId   CompanyId
1     1            34
2     1            63
3     1            34
4     1            63
5     2            34
6     2            73
7     2            34
8     2            34
9     3            34
10    3            84
11    3             63
12    3            34
13    3            34
14    3            63

结果:

Id       ClientId
1        1
2        3

2 个答案:

答案 0 :(得分:1)

如果您的两家公司是固定的,并且您只想要一个方向A-> B-> A并且不关心B-> A-> B,您可以从历史中找到所有这些B公司之前和之后都有A公司存在。

类似的东西:

SELECT * FROM HistoryTable ht
WHERE CompanyID = 63 
AND EXISTS (SELECT * FROM HistoryTable h1 
            WHERE h1.ClientID = ht.ClientID 
            AND h1.CompanyID = 34
            AND h1.ID < ht.ID)
AND EXISTS (SELECT * FROM HistoryTable h2 
            WHERE h2.ClientID = ht.ClientID 
            AND h2.CompanyID = 34
            AND h2.ID > ht.ID)

编辑:通过3次互换,它会变得更复杂:

SELECT * FROM HistoryTable ht 
WHERE CompanyID IN (63,34)
AND EXISTS (SELECT * FROM HistoryTable h1 
            WHERE h1.ClientID = ht.ClientID 
            AND h1.CompanyID IN (34,63)
            AND h1.CompanyID <> ht.CompanyID
            AND h1.ID < ht.ID)
AND EXISTS (SELECT * FROM HistoryTable h2 
            WHERE h2.ClientID = ht.ClientID 
            AND h2.CompanyID IN (34,63)
            AND h2.CompanyID <> ht.CompanyID
            AND h2.ID > ht.ID
            AND EXISTS (SELECT * FROM HistoryTable h3 
                        WHERE h3.ClientID = h2.ClientID 
                        AND h3.CompanyID IN (34,63)
                        AND h3.CompanyID <> h2.CompanyID
                        AND h3.ID > h2.ID))

我还为两个方向的互换添加了。 在A-> B-> A-> B的情况下,ht表应该代表B-2nd公司,我们检查它之前是否存在A(h1),以及它之后是否存在A(h2)自己也有B(h3)

答案 1 :(得分:1)

最简单的方法就是将历史表连接4次并使用连接以及过滤结果的位置。它会起作用,但在性能方面非常糟糕。只有在您没有大量数据或没有匆忙的情况下才能使用它。

.hide .detail-view-table thead > tr > th.detail,
.hide .detail-view-table tbody > tr:not(.detail-view) > td:first-of-type {
display: none;
}