SQL和分组依据,选择问题

时间:2015-01-30 07:33:01

标签: sql sql-server group-by

您好,抱歉没有信息的标题。想不到更好。所以,我的问题就是这样。我在两个表中有两个关键变量,table1只有key1,table2同时有key1和key2将key1链接到key2。表1还有一个特定年份的变量。

现在问题就在于此。我想知道的是所有key1变量的列表,这些变量链接到在同一年变量上具有多个key1变量的key2变量。因此,table1说明了2000年的key1个案例A和B,它们与table2中的一个相同的key2变量相关联。所以实际上,我对特定年份的单个key2的key1 double感兴趣。

SELECT query.key2
FROM (
    SELECT DISTINCT a.key1, b.key2, a.year
    FROM table1 AS a JOIN table2 AS b ON a.key1=b.key1
    WHERE a.year IS NOT NULL
    )
    AS query
GROUP BY query.key2, query.year
HAVING COUNT(*)>1

这是我用来获取key2个案例的代码,这个案例在同一年内链接了多个1个key1案例。要获取链接到这些key2个案的所有key1个案的列表,可以很容易地将其添加为table2上查询的子查询。但结果是所有key1案例都与该特定key2相关联。我想要的是特别是同一年的双打。我对这个看似简单的任务感到愚蠢,因为它没有列在group by子句中,并且在子查询中使用key2 case再次赢得了不想要的key1案例,我无法在SELECT中输入密钥。来自不同的年份。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

Notulysses,这并不能解决问题。它设法在所需的年份下对key1和key2个案进行分组,但是链接了太多的key1个案例,即。将key1链接到key2与年份无关。

代码编码器:table1就像

关键1年加上一堆无趣的变量

表2:

key1 key2加上其他一些无趣的变量。

我本质上想要的是当key1案例A和B(在2000年)链接到一个key2时,这样的key1的列表。我知道,很难解释,但是英语不是我的主要语言,没有视觉辅助,当人们不知道表格和数据时,这个想法并不是最简单的传达。

无论如何,我设法做到了。我基本上做的是首先创建临时表,我保存了所有key2个案例,这些案例有多个案例链接到它一年。然后我使用DENSE_RANK函数和标记年份,key2加倍并且休息很容易。就这样:

CREATE TABLE #temp2 (key2 VARCHAR(50), key1 VARCHAR(50), year DATE, dr INT)
INSERT INTO #temp2
SELECT b.key2, a.key1, a.year,
DENSE_RANK() OVER (ORDER BY b.key2, a.year DESC) AS dr
FROM table1 AS a JOIN table2 AS b ON a.key1=b.key1
WHERE b.key2 IN (SELECT key2 FROM #temp1) --#temp1 being table with key2's from previous query
ORDER BY b.key2, a.year DESC

SELECT *
FROM #temp2
WHERE dr IN (
    SELECT dr
    FROM #temp2
    GROUP BY dr
    HAVING COUNT(*)>1)

这是一个笨拙的解决方案,但它的工作原理。欢迎更好的想法!

答案 1 :(得分:0)

SELECT t1.*
     , t2.key1
FROM ( 
    SELECT DISTINCT  b.key2
         , a.year
    FROM table1 a 
    LEFT JOIN table2 b ON a.key1 = b.key1
    WHERE b.key1 IS NOT NULL
    GROUP BY b.key2
           , a.year
    HAVING COUNT(a.key1) > 1) t1
JOIN table2 t2 ON t1.key2 = t2.key2

答案 2 :(得分:0)

WITH TABLECTE 
AS
    SELECT DISTINCT a.key1, b.key2, a.year
    FROM   table1 AS a JOIN table2 AS b ON a.key1=b.key1
    WHERE  a.year IS NOT NULL
SELECT TABLECTE.key2 
FROM   TABLECTE
GROUP BY TABLECTE .key2, TABLECTE .year
HAVING COUNT(*)>1