【问题标题】:Return two rows from SQL table with a difference in values [duplicate]从 SQL 表中返回两行值不同的行[重复]
【发布时间】:2016-10-23 12:39:10
【问题描述】:

我试图从表中返回值不同的 2 行,而不是一个 SQL 聪明人,我被困住了,任何帮助将不胜感激:-)

TABLE A:

NAME    DATA
Oscar   HOME1
Jens    HOME2
Will    HOME1
Jeremy  HOME2
Al      HOME1

结果,应该是 DATA 值不同的 2 个随机行

NAME   DATA
Oscar  HOME1
Jeremy HOME2

有人吗?

【问题讨论】:

  • 如果代码不需要像 HOME1 HOME2 这样的静态条目,那就更好了
  • 你的 rdbms 是什么? Sql Server、Postgres、Oracle?
  • 这个问题应该属于代码高尔夫吗? codegolf.stackexchange.com

标签: sql


【解决方案1】:

获取随机数据的简单方法。

;with tblA as (
select name,data,
row_number() over(partition by data order by newid()) rn
from A
)
select name,data
from tblA
where rn = 1

【讨论】:

  • 难道不是where rn <= 2,因为 OP 想要 2 行(或 IN (1,2))?
  • @Igor No. 见partition by
  • 假设 OP 有 Sql Server。
  • 太棒了,谢谢。 @JuanCarlosOropeza - IMO 你必须假设一些事情,因为 OP 提供的信息很少。如果 OP 想要一个特定于服务器的解决方案,他们应该将其包含在他们的问题中。
  • @Igor 我可能会认为另一种方式,一般规则,如果你认为你可能是错的。所以不要浪费你的时间问错误的问题。最好询问详情。很明显 OP 是新用户,所以请教他如何提出更好的问题。
【解决方案2】:

你可能需要

select * from my_table a
inner join my_table b on a.data !=b.data
where a.data in ( SELECT data FROM my_table ORDER BY RAND() LIMIT 1);

为你的代码

SELECT * 
FROM [dbo].[ComputerState] as a
INNER JOIN [dbo].[ComputerState] as b ON a.ServiceName != b.ServiceName 
WHERE a.ServiceName IN ( 
     SELECT  top 1  [ServiceName] FROM [dbo].[ComputerState] 
);

【讨论】:

  • 如何返回 2 个随机行?
  • @devlincarnate 正确.. 我已经用随机数据更新了答案
  • 这将返回一行,其中包含 2 组值。该问题要求在两个单独的行中输入值。
  • BY "inner join table b" 你的意思是 "inner join table a" 因为它是同一张表=
  • 内连接 bi 表示与同一个表的内连接 .. 正是 .. 在 sql 中,表是表 .. 相同或不同的是表 .. 你可以像你一样明确地使用它们条件..
【解决方案3】:

如果问题真的这么简单,您可以使用MAX()MIN() 等聚合来为每个不同的DATA 抓取一行:

SELECT   MAX(NAME), DATA
FROM     TABLE_A
GROUP BY DATA

当然,如果在需求中引入任何其他变量,这可能不再起作用。

【讨论】:

  • 这是怎么随机的?
  • @devlincarnate 好点,我阅读了上面的部分,重点是简单地拥有不同的DATA 值。如果它必须是真正随机的,那么这是行不通的。
  • 列 'DATA' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。你知道这是什么吗?
  • @dahund DATA 就在:GROUP BY DATA
【解决方案4】:
;WITH cteA AS (
    SELECT
       name
       ,data
       ,ROW_NUMBER() OVER (PARTITION BY data ORDER BY NEWID()) as DataRowNumber
       ,ROW_NUMBER() OVER (PARTITION BY 1 ORDER BY NEWID()) as RandomRowNumber
    FROM
       A
)

SELECT *
FROM
    cteA
WHERe
    DataRowNumber = 1
    AND RandomRowNumber <= 2

这扩展了@AlexKudryashev 的回答。

;with tblA as (
select name,data,
row_number() over(partition by data order by newid()) rn
from A
)
select name,data
from tblA
where rn = 1

他所拥有的唯一问题是rn = 1 的行数将取决于COUNT(DISTINCT data),因此它可能导致超过 2 个结果。要解决这个问题,可以添加一个SELECT TOP 2 子句,但它可能不是完全随机的结果,因为它取决于 SQL 如何优化查询的序数结果,这可能是一致的。要获得真正的随机,请添加第二个随机行号并将结果限制在其中的前 2 个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-26
    • 2022-09-23
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多