【问题标题】:SQL and group by, select issuesSQL 和 group by,选择问题
【发布时间】:2015-03-29 15:43:59
【问题描述】:

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

现在问题来了。我想知道的是所有 key1 变量的列表,这些变量链接到这样的 key2 变量,这些变量在同一年变量上有多个 key1 变量。所以 table1 说 2000 年的 key1 案例 A 和 B 链接到 table2 中的一个相同的 key2 变量。所以实际上,我对特定年份的单个 key2 的 key1 双打感兴趣。

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

这是我用来获取同年有超过 1 个 key1 案例链接的 key2 案例列表的代码。要获取链接到这些 key2 案例的所有 key1 案例的列表,只需将其添加为 table2 上的查询的子查询即可。但这会导致所有与特定 key2 相关联的 key1 案例。我想要的是同年双打。我对这个看似简单的任务感到目瞪口呆,我不能在 SELECT 中输入键,因为它没有在 group by 子句中列出,并且再次在子查询中使用 key2 案例不会过滤掉来自不同年份的不需要的 key1 案例。有什么想法吗?

【问题讨论】:

  • 你能添加预期的输出和你的表格数据吗?

标签: sql sql-server group-by


【解决方案1】:

Notulysses,这并不完全奏效。它设法将 key1 和 key2 案例分组到所需的所需年份,但链接了太多 key1 案例,即。将 key1 链接到 key2 成为未连接的年份。

编码器:table1 就像

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

表 2:

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

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

不管怎样,我成功了。我基本上所做的是首先创建临时表,在其中保存了所有 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 为此。
【解决方案2】:
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

【讨论】:

    【解决方案3】:
    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
    

    【讨论】:

      猜你喜欢
      • 2018-05-13
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 2012-10-02
      • 2021-10-02
      相关资源
      最近更新 更多