【问题标题】:Selecting specific data based on multiple conditions根据多个条件选择特定数据
【发布时间】:2013-03-07 10:29:43
【问题描述】:

我需要一些帮助来构建用于数据库查询的 SQL 命令。数据库有 5 列:

Date(string) 
Name(string) 
number(int)

每个日期、名称和编号可以有多个条目。

我只想为每个日期和名称组合选择一行。问题是这些有多个实例。对于每个日期和名称组合,我想选择具有最高数字的那个。我想按日期订购。例如:

date   |  name  |  number
1/1/1     henry      500
1/1/1     henry      2000 
1/1/1     jacob      5
1/1/1     jacob      8
1/2/1     henry      6

命令将返回:

1/1/1     henry     2000
1/1/1     jacob     8 
1/2/1     henry     6   

我一直在搞乱一些命令,但我很迷茫。这甚至可能吗?

【问题讨论】:

  • 您使用的是什么 SQL 风格(MySql、SQL Server、Oracle 等)?你已经尝试了什么?你知道GROUP BY子句怎么用吗?
  • SQL Server 2012。是的,我愿意。我想我知道你要去哪里。我会试一试。
  • 我发布了我的想法。如果您还有其他需要查看的列,那么解决方案就不会像我的那么简单。

标签: sql sql-server sql-server-2008 tsql sqlcommand


【解决方案1】:

你可以使用ROW_NUMBER:

WITH cte 
     AS (SELECT date, 
                name, 
                number, 
                rn = Row_number () 
                       OVER( 
                         partition BY date, name 
                         ORDER BY number DESC) 
         FROM   dbo.tablename) 
SELECT date, 
       name, 
       number 
FROM CTE
WHERE  rn = 1 
ORDER  BY date ASC

DEMO

ROW_NUMBER 将始终为每组选择一条记录。如果您想获取给定名称中编号最高的所有行(如果有多个),请改用DENSE_RANK

【讨论】:

  • 谢谢。但是我不确定我是否理解 WITH cte... 这可以在 SQL Server 中使用吗?
  • @40Alpha:是的,这是在 MS SQL-Server 中工作的 TSQL。它使用Common Table Expression + ROW_NUMBER(也存在于其他 rdbms 中,如 Oracle)。我使用 CTE 进行简化,因为它们提高了可读性。
  • 现在说得通了哈哈!谢谢你。如果成功了,我会告诉你的。
【解决方案2】:
SELECT date, name, MAX(number)
FROM Table1
GROUP BY date, name
ORDER date, name

【讨论】:

    【解决方案3】:

    尝试按日期和名称分组,然后选择最大数量。像这样(确切的语法可能因您的 sql 版本而异):

    select
       date,
       name,
       max(number)
    from
       yourtable
    group by
       date,
       name
    order by
       date asc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多