如何在x和y之间获取选定的列行

时间:2011-02-13 09:26:33

标签: sql sql-server sql-server-2005

我正在尝试编写一个查询,根据另一列的x和y行值返回列的选定行。

但是,即使我已经指定了一个范围,以下查询也会返回两个所选列的所有行。谁能告诉我我在做什么?

select username, password 
from loginuser 
group by username, password 
having count(id) between '1' and '2'

2 个答案:

答案 0 :(得分:2)

HAVING运算符将应用于聚合函数 - 如果您要选择SUM超过某个值或某些值的行。

您只需要定期选择 - 使用WHERE子句:

SELECT username, password 
FROM dbo.loginuser 
WHERE id BETWEEN 1 and 2

这将选择ID的值介于1和2之间的所有行。

如果您想按行号选择,按ID排序 - 您需要这样的内容:

;WITH RowNumberValues AS
(
   SELECT username, password,
          ROW_NUMBER() OVER(ORDER BY ID) AS 'RowNum' 
   FROM dbo.loginuser 
)
SELECT username, password
FROM RowNumberValues
WHERE RowNum BETWEEN 1 AND 2

如果您的查询中没有SUMCOUNT,则您不应该使用GROUP BY ...

这就是你要找的东西吗?根据您的问题和疑问,您并不完全清楚您真正想要的是什么......您能更详细地描述您想要选择的'吗?

答案 1 :(得分:1)

为什么您的查询不起作用

select username, password 
from loginuser 
group by username, password 
having count(id) between '1' and '2'

注意:COUNT()返回一个int。 SQL Server将转换您的引用的(下次,请不要)'1' and '2'并将它们设为整数值1 and 2

查询意味着:

  • FROM :从表loginuser
  • 获取数据
  • GROUP BY :对于每个DISTINCT用户名,密码,将它们组合在一起
  • SELECT :在分组过程中,检索列usernamepassword并计算count(id),即使用该SAME用户名和密码的行数
  • HAVING :使用生成的计数,将结果限制为只有用户名+密码的唯一组合在表格中显示一次或两次的结果

你想要什么?

前两个不同的用户名和密码组合,没有特别的顺序?

select TOP 2 username, password 
from loginuser 
group by username, password 

表loginuser中每个不同用户名+密码组合的最新两行? (您需要PARTITION BY子句)

select username, password 
from
(
  select *, rn=row_number() over (
    partition by username, password order by id desc)
  from loginuser
) X
WHERE rn between 1 and 2