【问题标题】:SQL Server - Select if one of all columns are uniqueSQL Server - 如果所有列之一是唯一的,请选择
【发布时间】:2019-04-13 20:35:04
【问题描述】:

我想选择一行中的多列是否相同。例如:

col1 col2 col3 col4

  a    b    1   2
  b    b    1   2
  a    c    1   2
  b    b    1   3
  a    c    2   1

条件:仅当列 (col1, col2, col3) 的值与其他行不同且 col4 的值是相同的最大行数时才选择。

例如预期的输出是:

  a    b    1   2
  b    b    1   3
  a    c    1   2
  a    c    2   1

【问题讨论】:

  • 当您实际尝试编写 SQL 查询时,它们变得越来越可能。话虽如此,您是否尝试过自己回答这个问题?
  • 您有两个答案,因为当您说 col4 是最大时,您的意思并不清楚。最大什么? col3 和 col4?其他匹配的行?还有什么?
  • @TimBiegeleisen 我已经尝试过 distinct 并没有任何意义
  • @Hogan 我不明白你的意思,伙计们。 col4 的值是整数,所以如果有多个相同的行,它将返回具有 col4 最大值的行
  • @HungNguyen 如果你 accept the most appropriate answer 会很好

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

可以,只需使用 group bymax 聚合作为

with tab(col1,col2,col3,col4) as
(
  select 'a','b',1,2 union all
  select 'b','b',1,2 union all
  select 'a','c',1,2 union all
  select 'b','b',1,3 union all
  select 'a','c',2,1        
)
  select col1, col2, col3, max(col4) as col4
    from tab
   group by col1, col2, col3;

col1  col2  col3  col4
  a     b    1     2
  a     c    1     2
  a     c    2     1
  b     b    1     3

Rextester Demo

【讨论】:

  • 虽然您的方法是基本、最简单和最好的方法,但我也需要提醒您使用 ROW_NUMBER() 方法。如果也有其他方法会更好(仅供参考)。
  • @iSR5 是的,这适用于某些情况,主要是 row_number 与子查询一起使用。谢谢。
  • @iSR5 -- 当其他列(在本例中为 col1、col2、col3)不同时使用行号。例如,在同一部门编号中具有最高薪水的人员的返回值。 row_number() 在这里没有意义。
【解决方案2】:

强制NOT EXISTS 解决方案...您的条件写为不存在查询:

DECLARE @t TABLE (col1 varchar(100), col2 varchar(100), col3 int, col4 int);
INSERT INTO @t VALUES
('a', 'b', 1, 2),
('a', 'c', 1, 2),
('a', 'c', 2, 1),
('b', 'b', 1, 2),
('b', 'b', 1, 3);

SELECT *
FROM @t AS t
WHERE NOT EXISTS (
    SELECT 1
    FROM @t AS dup
    WHERE dup.col1 = t.col1
    AND   dup.col2 = t.col2
    AND   dup.col3 = t.col3
    AND   dup.col4 > t.col4 -- outer row has smaller col4
)

Demo on DB Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-10
    • 2014-08-24
    • 2014-12-01
    • 2017-06-18
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    相关资源
    最近更新 更多