sql - 为每个不同的用户获取表中的第一个最低值及其发生日期

标签 sql postgresql

我正在尝试为表中的每个 DISTINCT 用户查找表中的第一个最小值及其发生日期。

这是表架构和一些示例数据:

CREATE TABLE diet_watch (
  entry_date date NOT NULL,
  user_id    int default 1,
  weight     double precision NOT NULL
);

INSERT INTO diet_watch VALUES ('2001-01-01', 1, 128.2);
INSERT INTO diet_watch VALUES ('2001-01-02', 1, 121.0);
INSERT INTO diet_watch VALUES ('2001-01-03', 1, 122.3);
INSERT INTO diet_watch VALUES ('2001-01-04', 1, 303.7);
INSERT INTO diet_watch VALUES ('2001-01-05', 1, 121.0);
INSERT INTO diet_watch VALUES ('2001-01-01', 2, 121.0);
INSERT INTO diet_watch VALUES ('2001-01-06', 2, 128.0);

我想出的 SQL 在 this snippet

我后来被告知这是不正确的,也许有人可以解释我的 SQL 有什么问题?

注意:如果可能的话,我更喜欢 ANSI SQL,但我使用的是 PostgreSQL,所以如果我必须使用特定风格的 SQL,它必须在 PG 上工作。

最佳答案

注意:不确定Window函数是不是ANSI SQL

WINDOW 函数是 SQL:2003 规范的一部分: http://en.wikipedia.org/wiki/Window_function_%28SQL%29#Window_function (谢谢 @a_horse_with_no_name)

试试这个:

http://sqlfiddle.com/#!1/7aa4e/22

SELECT *
  FROM 
    (
     SELECT a.*, 
            ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY weight) AS Position
       FROM diet_watch a

    ) a
    WHERE a.Position = 1 

关于sql - 为每个不同的用户获取表中的第一个最低值及其发生日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11530120/

相关文章:

sql - Oracle 11g - 临时表空间段未发布(Oracle 错误?)

mysql - MySQL 中何时使用单引号、双引号和反引号

sql - 在 select 语句中选择多个模式

java - 如何从 configuration.buildSessionFactory (PSQL) 捕获密码错误?

python - 有没有一种方法可以使用 pip 安装 psycopg2 而无需在主机系统上安装 postgres

mysql - SQL 将值拆分为多行

sql - 将 "WHERE"参数传递给 PostgreSQL View?

postgresql - 如何更改postgres中的列类型

postgresql - varchar postgresql 的 double

sql - Postgres 从一个表到多个表选择单个表行